为什么 TypeScript 中的 'instanceof' 会给我错误“'Foo' 仅指类型,但在这里被用作值。”?

2023-11-25

我写了这段代码

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 FooJavaScript 将执行运行时检查以查看是否Foo.prototype存在于原型链的任何地方x.

然而,在 TypeScript 中,interfaces 没有发射。同样的道理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(使用前将#替换为@)

为什么 TypeScript 中的 'instanceof' 会给我错误“'Foo' 仅指类型,但在这里被用作值。”? 的相关文章

随机推荐

  • Plinq、Cores 和 WithDegreeOfParallelism?

    据我了解 Plinq 决定打开多少个线程 每个线程位于不同核心的线程上 按核心数 Core 1 Core 2 Core 3 Core 4 因此 如果我有一个 Plinq 任务来查找所有前 1000 个素数 Plink将打开一个新的Threa
  • 使用 Android 的 AudioTrack 组合声音样本字节会产生噪音

    我正在构建一个相当简单的 Android 应用程序 sdk 修订版 14 ICS 它允许用户一次选择两个音频剪辑 均为 RIFF WAV 格式 小端 签名 PCM 16 位编码 并将它们组合在创造新声音的各种方式 我用于此组合的最基本方法如
  • 在 OpenCV C++ 中将图像的所有白色像素更改为透明

    我在 OpenCV 中有这张图片imgColorPanel imread newGUI png CV LOAD IMAGE COLOR 当我用灰度加载它时imgColorPanel imread newGUI png CV LOAD IMA
  • 智能分页算法[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在寻找智能分页的示例算法 所谓聪明 我的意思是 我只想显示当前页面的 2 个相邻页面 因此我不会以长得可笑的页面列表结束 而是将其截断 这是一个简单的例子 可以让它更清楚 这就是
  • 如何在 Erlang 中读取整数?

    我正在尝试读取用户输入的整数 如 C 中的 cin gt gt nInput 我发现 io fread bif 来自http www erlang org doc man io html 所以我写这样的代码 ok X io fread 输入
  • 具有多个表的单个文本文件

    我正在尝试从具有多个表的单个文本文件导入数据 这些表的长度各不相同 但每个表之间有共同的间隔 每个表之间的分隔是一个数字后跟一个字符 例如 19 EOP 1 10 92 9144 202 1271 0 B 10 Dec 2014 11 46
  • 如何从 Win32 中的 func ptr 获取模块句柄?

    我正在研究虚拟机的本机调用绑定 其中一项功能是能够在运行时按名称查找标准 libc 函数 在 Windows 上 这变得有点麻烦 因为我需要获取进程中当前加载的 msvcrt 模块的句柄 通常这是 msvcrt dll 但也可能是其他变体
  • 为什么不可变对象受到 JVM GC 的喜爱?

    我知道JVM GC喜欢短寿命对象的原因 因为它可以在minor GC中收集 但为什么 JVM GC 喜欢不可变对象呢 编辑 Charlie Hunt 说 GC 喜欢他的不可变对象推介会 Thanks 如果 GC 可以知道某个对象不包含对任何
  • jQuery - 如何知道窗口是否正在调整宽度/高度或两者的大小?

    我在使用 jQuery 函数调整窗口大小时遇到 一些问题 resize 我想知道哪个尺寸变大 变小 宽度或高度 我需要这个 因为如果我只设置两个条件 如果宽度比 div 大 50px 如果高度比 div 大 50px pseudocode
  • 从 NSArray 获取单个属性的 NSArray

    我面临着一个非常常见的情况 我有一个 NSArray 它有一个自定义类型的对象 比如 Person Person 类具有以下属性 firstName lastName 和age 如何从具有 Person 对象的 NSArray 中获取仅包含
  • 具有可变 Excel 连接管理器的 SSIS

    我正在尝试使用 SSIS 中的 WMI 事件观察器任务自动执行包 我想要的功能是当 Excel 文件放入某个文件夹时自动执行包 但是 这些 excel 文件将是用于填充数据库的连接管理器 目前 SSIS 不允许我这样做 因为我的 Excel
  • Primefaces selectCheckboxMenu 过滤器在 selectOneMenu 位于数据表内部时不起作用

    我有一个 Primefaces 5 0 数据表 我使用两列过滤器 selectOneMenu Filter1 和 selectCheckboxMenu Filter2 两个过滤器的数据都填充得很好 selectOneMenu Filter1
  • 根据属性值有条件地包含组件

    我有一个 ListView 它显示来自 API 的一些数据 在我的列表项中 我需要有两个不同的组件树 具体取决于该行的数据 更具体地说 如果该行有关联的图像 我需要显示带有标签的图像 并以某种方式排列 如果它没有图像 那么我只想显示一个标签
  • UI图像元数据

    在我的应用程序中 我从资源库中检索 UIImage 该图像具有元数据 然后 应用程序会调整图像大小并旋转图像 从而创建新图像 新图像没有预期的原始元数据 但是如何在上传之前将元数据添加回图像 提前致谢 我自己修复了它 这是我使用的方法 以防
  • Android RecyclerView 滚动性能

    我创建了 RecyclerView 示例创建列表和卡片指导 我的适配器有一个仅用于膨胀布局的模式实现 问题是滚动性能较差 这是在只有 8 个项目的 RecycleView 中 在一些测试中我验证了在Android L中不会出现这个问题 但在
  • 如何在 Python 中将长整型写为二进制?

    在 Python 中 长整数具有无限的精度 我想将 16 字节 128 位 整数写入文件 struct标准库仅支持最多 8 字节整数 array具有相同的限制 有没有办法在不屏蔽和移动每个整数的情况下做到这一点 这里需要澄清一下 我正在写入
  • BASH:如何对管道中的数字执行算术运算

    我在管道中得到一串数字 并且想在将它们传递到下一部分之前执行一些操作 但我有点不知道如何在不破坏管道的情况下进行操作 例如 gt echo 1 2 3 4 5 some command cat 1 4 9 16 25 gt 您对如何使这样的
  • JSF 命令按钮立即=“true”

    我遇到的情况是 selectOneMenu 的值绑定到支持 bean 我需要一个不更新模型值的按钮 这就是为什么它具有立即 true 属性 该按钮的操作方法更改了 selectOneMenu 绑定到的值 但是当重新显示页面时 将显示原始值
  • 如何访问使用外部样式表的 javascript 对象的样式属性?

    我有一个外部样式表 其中包含以下内容 box padding left 30px background color BBFF88 border width 0 overflow hidden width 400px height 150px
  • 为什么 TypeScript 中的 'instanceof' 会给我错误“'Foo' 仅指类型,但在这里被用作值。”?

    我写了这段代码 interface Foo abcdef number let x Foo string if x instanceof Foo 但是 TypeScript 给了我这个错误 Foo only refers to a type