2017-03-17 188 views
0

我想要寫與接受來自對象或類型A K/V對中的值的參數型保護的函數...打字稿映射類型鍵/值

type VodTreeName = { 
    Movie: 'movie_vod', 
    TV: 'tv_vod', 
    VideoStore: 'video_store' 
}; 

function test(something: VodTreeName) { 
    // expecting something === 'movie_vod' 
} 

test(VodTreeName.Movie); 
// 'VodTreeName' only refers to a type, but is being used as a value here. 

- 或 -

const VodTreeName = { 
    Movie: 'movie_vod', 
    TV: 'tv_vod', 
    VideoStore: 'video_store' 
}; 

function test(something: keyof typeof VodTreeName) { 
    // expecting something === 'movie_vod' 
} 

test(VodTreeName.Movie); 
// Argument of type 'string' is not assignable to parameter of type '"Movie" | "TV" | "VideoStore"'. 

我還能如何做到這一點,而無需其他模塊類型和對象,我需要導出/導入?

回答

2

你不能在運行時使用類型別名,沒有js等價的。

在第二片段中test功能預計VodTreeName的關鍵,但你傳遞的價值,它應該是:

function test(key: keyof typeof VodTreeName) { 
    console.log(VodTreeName[key]); 
} 

test("Movie"); 

如果你想使用它,像這樣:

test(VodTreeName.Movie); 

然後你基本上尋找一個基於字符串的枚舉,在這種情況下檢查這個線程:Create an enum with string values in Typescript和這個問題:Proposal: String enums