这段代码是我写的
interface Foo {
abcdef: number;
}
let x: Foo | string;
if (x instanceof Foo) {
// ...
}
但是 TypeScript 给了我这个错误:
'Foo' only refers to a type, but is being used as a value here.
为什么会这样?我认为 instanceof
可以检查我的值是否具有给定类型,但 TypeScript 似乎不喜欢这样。
最佳答案
长话短说
instanceof
适用于类,不适用于接口(interface)或类型别名。
TypeScript 试图告诉我什么?
问题是 instanceof
是来自 JavaScript 的构造,在 JavaScript 中,instanceof
期望右侧操作数有一个值。
具体来说,在 x instanceof Foo
中,JavaScript 将执行运行时检查以查看 Foo.prototype
是否存在于 x
的原型(prototype)链中的任何位置。
但是,在 TypeScript 中,interface
没有 emit。 type
别名也是如此。这意味着 Foo
和 Foo.prototype
在运行时都不存在,所以这段代码肯定会失败。
TypeScript 试图告诉您这可能永远 行不通。 Foo
只是一种类型,它根本不是一个值!
如果您来自另一种语言,您可能打算在这里使用一个类。类确实在运行时创建值,但您可能希望在下面阅读一些关于此的注释。
“如果我仍然想要一个type
或interface
,我可以做什么来代替instanceof
?”
你可以看看type guards and user-defined type guards .
“但是如果我只是从interface
切换到class
呢?”
您可能想从 interface
切换到 class
,但您应该意识到在 TypeScript 的结构类型系统中(事物主要是基于形状的),您可以生成与给定类具有相同形状的任何对象:
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;
在这种情况下,您有具有相同类型的 x
和 y
,但是如果您尝试在任何一个上使用 instanceof
,您另一边会得到相反的结果。因此,如果您正在利用 TypeScript 中的结构类型,instanceof
不会真的告诉您很多关于该类型的信息。
关于javascript - 为什么 TypeScript 中的 'instanceof' 给我错误 "' Foo' only references a type, but is being used as a value here."?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46703364/