2017-05-19 80 views
3

我想找到一種方法來傳遞一個對象來運行,並檢查它在運行時輸入。這是一個僞代碼:如何在運行時檢查TypeScript中的對象類型?

func(obj:any){ 
    if(typeof obj === "A"){ 
    // do something 
    } 
    else if(typeof obj === "B"{ 
    //do something else 
    } 

} 
a:A; 
b:B; 
func(a); 

但typeof運算總是返回「對象」,我無法找到一種方式來獲得真正的類型「A」或「B」的。 instanceof也沒有工作,並返回相同的。 任何想法如何在TypeScript中做到這一點?

謝謝你的幫助!

回答

6

類型在編譯時被剝離並且在運行時不存在,所以在運行時不能檢查類型。

你可以做的是檢查對象的形狀是你所期望的,並且打字稿可以使用user-defined type guard返回true斷言在編譯時的類型,如果形狀您的期望相符:

interface A { 
    foo: string; 
} 

interface B { 
    bar: number; 
} 

function isA(obj: any): obj is A { 
    return obj.foo !== undefined 
} 

function isB(obj: any): obj is B { 
    return obj.bar !== undefined 
} 

function func(obj: any) { 
    if (isA(obj)) { 
    // In this block 'obj' is narrowed to type 'A' 
    obj.foo; 
    } 
    else if (isB(obj)) { 
    // In this block 'obj' is narrowed to type 'B' 
    obj.bar; 
    } 
} 

Example in Playground

+0

非常感謝你,現在很清楚! – Eden1971

+0

檢查此:https://aliolicode.com/2016/04/23/type-checking-typescript/請岸,你也看到這行:console.log(john instanceof Person); //真的......乾杯! – peter70

+0

@ peter70只適用於類實例,不適用於其他類型(如接口)。 OP提到'instanceof'不起作用,所以我認爲他有一個非類實例對象。 – Aaron

相關問題