2017-09-07 41 views
1

可以说我有一个区分联合,像这样:途径段区分联合分为不同的类型有和无财产

type Route = HomeRoute | ProfileRoute | BlogRoute; 


type HomeRoute = { 
    route: '/home' 
} 

type ProfileRoute = { 
    route: '/profile/:userId', 
    params: { 
    userId: string; 
    } 
} 

type BlogRoute = { 
    route: '/blog/:teamId', 
    params: { 
    teamId: string; 
    } 
} 

而且我有对Route对象进行动作的功能,有一些可选的逻辑,如果他们有PARAMS :

function processRoute(route: Route) { 
    if ('params' in route) { 
    const { params } = route; // <-- this errors 
    } 
} 

似乎没有成为一个方式(即我可以看到)来检查params无需添加注释any ...

01 2375576​​

有没有办法做到上述不铸造任何(在参数paramsInRoute)?

playground link

回答

3

我个人而言,使用型后卫会很高兴你有:

function paramsInRoute(route: any): route is { params: {[key: string]: string} } { 
    return ('params' in route); 
} 

因为打字稿肯定变窄的传入的Route对象ProfileRoute | BlogRoute

if (paramsInRoute(route)) { 
    const notHomeRouteAnymore: ProfileRoute | BlogRoute = route; // no error 
} 

但是,如果你担心有人这样做:

const notRoute = "This is not a route"; 
if (paramsInRoute(notRoute)) { notRoute.params.oops = 'what' }; 

,那么你可以这样做:

function paramsInRoute(route: Route): route is Route & { params: {[key: string]: string} } { 
    return ('params' in route); 
} 

它做同样的在缩小,而是防止错误呼叫:

paramsInRoute(notRoute); // error 

希望有帮助;祝你好运!

+0

这么简单!大概应该先尝试一下:) –

+0

对此的另外一个想法是,使用类型警卫仍然是一个断言,所以它由开发者确定'&'-ed属性在这里是正确的。 –

相关问题