javascript - 为什么 TypeScript 中的 'instanceof' 给我错误 "' Foo' only references a type, but is being used as a value here."?

标签 javascript typescript instanceof

这段代码是我写的

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 别名也是如此。这意味着 FooFoo.prototype 在运行时都不存在,所以这段代码肯定会失败。

TypeScript 试图告诉您这可能永远 行不通。 Foo 只是一种类型,它根本不是一个值!

如果您来自另一种语言,您可能打算在这里使用一个类。类确实在运行时创建值,但您可能希望在下面阅读一些关于此的注释。

“如果我仍然想要一个typeinterface,我可以做什么来代替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;

在这种情况下,您有具有相同类型的 xy,但是如果您尝试在任何一个上使用 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/

相关文章:

javascript - Ajax、JSON 对象与 php 交互

html - 对象数组的 Mat 选择过滤器

typescript - 如何在Typescript中按属性过滤对象类型的联合?

java - 创建该对象的新实例时滚动浏览对象

javascript - d3.js 点击事件显示/隐藏 html 元素

javascript - mouseenter 离开导致 jQuery 中的闪烁

typescript - 将每个数组元素绑定(bind)到选项标签

java - 如何在没有特定对象的方法内执行instanceof?

php - 当使用 !(self::$_instance instanceof self) 为什么这不起作用

javascript - 运行按钮点击页面加载