2017-10-12 48 views
8

我寫了這個代碼爲什麼在打字稿「的instanceof」給我的錯誤「‘富’只是指一個類型,但這裏正在使用的值。」?

interface Foo { 
    abcdef: number; 
} 

let x: Foo | string; 

if (x instanceof Foo) { 
    // ... 
} 

但打字稿給了我這個錯誤:

'Foo' only refers to a type, but is being used as a value here. 

這究竟是爲什麼?我認爲instanceof可以檢查我的值是否有給定的類型,但TypeScript似乎不喜歡這樣。

+0

見下面@ 4castle答案。否則,你是對的,我會做成'Foo | string'。 –

+1

[使用Typescript檢查接口類型]的可能重複(https://stackoverflow.com/questions/14425568/interface-type-check-with-typescript) – Cerbrus

+0

[可能重複[檢查變量是否是特定接口類型打字稿工會(https://stackoverflow.com/questions/29172486/check-if-variable-is-a-specific-interface-type-in​​-a-typescript-union)(我真的不希望單幅自己動手錘) – Cerbrus

回答

17

這是怎麼回事

問題是instanceof是從JavaScript構建,並在JavaScript中,instanceof預計,右側操作數。 具體而言,在x instanceof Foo的JavaScript將執行運行時檢查以看是否Foo.prototypex原型鏈的任何地方存在。

但是,在TypeScript中,interface s沒有發射。 這意味着,Foo.prototype在運行時不存在,因此,這段代碼肯定會失敗。

TypeScript正試圖給你一個警告:Foo只是一種類型;這根本不是一個價值!

「我能做什麼而不是instanceof?」

你可以看看type guards and user-defined type guards

「但是如果我剛從interface切換到class

你也許會從interface切換到class,但你應該認識到,在打字稿的結構類型系統(那裏的東西主要是形狀基於),你就可以生產任何有形狀相同的對象給定類:

class C { 
    a: number = 10; 
    b: boolean = true; 
    c: string = "hello"; 
} 

let x = new C() 
let y = { 
    a: 10, b: true, c: "hello", 
} 

// Works! 
x = y; 
y = x; 

在這種情況下,你有xy具有相同的類型,但如果你試圖在任何一個使用instanceof,你會得到另一個相反的結果。 因此instanceof不會真的如果您正在利用TypeScript中的結構類型,可以告訴您有關該類型的更多信息。

+0

會花費我很長時間才能發現一個爲自己! – series0ne

相關問題