typescript - 为什么我不能在 TypeScript 中将 `typeof x` 与 "null"或 "MyClass"进行比较?

标签 typescript

我写了一些代码来做一些运行时类型测试:

var x = window.opener;
if (typeof x === 'null') {
  // Do something
}
var y = getSomething();
if (typeof y === 'MyClass') {
  // ...
} else if (typeof y === 'array') {
  // ...
}

我在所有 if 表达式上都遇到了这个错误:

error TS2365: Operator '===' cannot be applied to types '"string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function"' and '"null"'.

这是 TypeScript 错误吗?为什么它不允许我像我想的那样使用 typeof

最佳答案

这不是typeof会!

typeof operator接受一个表达式并返回以下值之一*:

  • "string"
  • "number"
  • "boolean"
  • "symbol"
  • "undefined"
  • "object"
  • "function"

不会看到typeof产生类似 "null" 的值, "Array" ,或用户定义类的名称。注意 typeof null"object"对于 sad reasons .

糟糕!我该怎么办?

所以你想typeof比以前更酷了。好吧!

  • 测试null , 使用 expr === null .您可以使用惯用的 expr == null测试 undefinednull如果你的同事让你逃脱使用 ==
  • 要测试数组,请使用 Array.isArray(expr) .请注意,有些东西您希望是数组,例如 document.getElementsByTagName("div") , 不是( getElementsByTagName 返回 NodeList ),所以要小心
  • 要测试类类型,请使用 expr instanceof ClassName

我遇到了 99 个问题,IE8 是其中之一

如果您真的确定您有一个对象和运行时组合会产生不同的值(例如,您实际测试了它,并且它确实产生了一些其他字符串),请在测试的任一侧使用类型断言:

if (typeof x === <string>"magicthinger") {

*古代 浏览器 (IE8) 中查询 typeof对于一些奇特的浏览器对象,您可能会得到其他值,但没有现代 JavaScript 引擎可以做到这一点。

关于typescript - 为什么我不能在 TypeScript 中将 `typeof x` 与 "null"或 "MyClass"进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42102434/

相关文章:

typescript - 如何在 TypeScript 中获取属性名和类名

javascript - 警告 : Cannot update a component while rendering a different component. ReactJS

angular - Playright 使用 global-setup.ts 缓存 session 超时登录到应用程序,等待 DEBUG=0 的选择器,而 DEBUG=1 则不会超时

javascript - 编译 typescript 并保持正确的目录结构

import - 不能在 TypeScript 中使用导入的类作为返回类型

angular - 如何在 Angular 2 中将 header 设置为 application/json

javascript - 为什么我的 readState 逻辑中 document.body 为 null?

reactjs - 基本的 redux 概念 - 如何启动 reducer

javascript - 如何使用 Angular 显示 "tags"对象的内容?

typescript 创建模块