2017-08-07 82 views
1

反省我定義打字稿定製打字稿型

type MyType = 'left' | 'right'; 

如何檢查變量符合這種類型的自定義類型? 如何迭代這種類型的可能值? (例如創建相應的選擇元素)

+0

在運行時您無法對類型進行任何操作。這意味着你不能在運行時檢查或迭代類型。 –

回答

1

這是不可能的。

你必須編寫和使用這樣的事:

type MyType = 'left' | 'right'; 
const MyTypeMeta = ["left", "right"]; 

an old discussion here關於這個問題,有很多相互關聯的問題。也許希望this message但現在沒有完成。

+0

它實際上是我們試圖避免的解決方案:) –

+0

@YananAugen我明白,我有同樣的問題。我使用這個解決方案是因爲我沒有找到更好的(去年1月)。但看看我發佈的最後一個鏈接。這真的是我們需要的。也許不完美,但非常有前途。 – Paleo

1

你不能做到這一點與「簡單型」,但由於Typescript 2.4你可以使用枚舉字符串值:

enum MyType { 
    LEFT='left', 
    RIGHT='right' 
} 

for (let i in MyType) { 
    console.log(MyType[i]); //will print "left" and "right" 
} 

它的工作原理,因爲在運行時的命名對象MyType的存在,它的價值是{RIGHT:'right',LEFT:'left'}

1

在運行時添加類型信息是TypeScript的non-goal。這意味着他們不想讓你定義一個類型,然後在運行時檢查它。

但是,相反就好了:創建一個運行時存在的對象,並使用TypeScript來推斷它的類型信息。這裏有一種方法可以處理你的情況。

首先,添加以下輔助函數:

function stringLiteralArray<T extends string>(...args: T[]): T[] { 
    return args; 
} 

這有助於打字稿推斷字符串文本而不是僅僅string[]的數組。

現在,您可以創建一個名爲myType運行時的對象,並從中獲得MyType

const myType = stringLiteralArray('left', 'right'); // ('left'|'right')[] 
type MyType = (typeof myType)[number]; // 'left' | 'right' 

那麼你有兩種運行時和編譯時類型信息。您可以檢查是否一個變量是該類型的具有下列用戶定義類型後衛:

function isMyType(x: any): x is MyType { 
    return myType.includes(x); // needs es2016 at least, or implement yourself 
} 

可以遍歷myType在運行時,你可以在編譯時間上MyTypeexhaustiveness checking

function foo(x: MyType): string { // error, not exhaustive 
    switch (x) { 
    case 'left': return 'L'; 
    case 'rihgt': return 'R'; // error, 'rihgt' isn't 'left'|'right' 
    } 
} 

希望有幫助。