【问题标题】:Why can't I compare `typeof x` to "null" or "MyClass" in TypeScript?为什么我不能在 TypeScript 中将 `typeof x` 与“null”或“MyClass”进行比较?
【发布时间】:2017-02-08 08:15:27
【问题描述】:

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

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

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

错误 TS2365:运算符 '===' 不能应用于类型 '"string" | "数字" | “布尔” | “象征” | “未定义” | “对象” | “函数”和“空”。

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

【问题讨论】:

  • (注意:行为是 TypeScript 2.2 特有的,所以这在 TypeScript Playground 中还没有发生)

标签: typescript


【解决方案1】:

这不是typeof 所做的!

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

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

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

哎呀!我该怎么做?

所以你认为typeof 比以前更酷。哦,好吧!

  • 要测试null,请使用expr === null。如果您的同事允许您使用 ==
  • 要测试数组,请使用Array.isArray(expr)。请注意,某些您认为是数组的东西,例如 document.getElementsByTagName("div"),却不是(getElementsByTagName 返回 NodeList),所以要小心
  • 要测试类类型,请使用expr instanceof ClassName

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多