2017-09-07 57 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屬性在這裏是正確的。 –

相關問題