我写了这段代码
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 似乎不喜欢这样。
TL;DR
instanceof
适用于类,而不是接口或类型别名。
TypeScript 想告诉我什么?
问题是instanceof是 JavaScript 的构造,在 JavaScript 中,instanceof
期望一个value为右侧操作数。
具体来说,在x instanceof Foo
JavaScript 将执行运行时检查以查看是否Foo.prototype
存在于原型链的任何地方x
.
然而,在 TypeScript 中,interface
s 没有发射。同样的道理type
别名。这意味着既不Foo
nor Foo.prototype
在运行时存在,所以这段代码肯定会失败。
TypeScript 试图告诉你这可以never work. Foo
只是一个类型,它根本不是一个值!
如果您来自另一种语言,您可能打算在这里使用一个类。课程do在运行时创建值,但您可能需要阅读下面的一些注释。
“我能做什么来代替instanceof
如果我还想要一个type
or interface
?"
你可以看看类型保护和用户定义的类型保护.
“但是如果我刚刚从interface
to a class
?"
您可能会想从interface
to a class
,但你应该意识到,在 TypeScript 的结构类型系统中(其中事物主要是基于形状),您可以生成与给定类具有相同形状的任何对象:
class C {
a: number = 10;
b: boolean = true;
c: string = "hello";
}
let x = new C()
let y: C = {
a: 10, b: true, c: "hello",
}
// Works!
x = y;
y = x;
在这种情况下,你有x
and y
具有相同的类型,但如果您尝试使用instanceof
对于任何一个,您都会在另一个上得到相反的结果。所以instanceof
won't really如果您正在利用 TypeScript 中的结构类型,则会告诉您有关该类型的更多信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)