2017-10-12 47 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

相关问题