为什么不能将`typeof x`与'#34; null"进行比较。或者" MyClass"在TypeScript中?

时间:2017-02-08 00:15:27

标签: typescript

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

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" | "数" | "布尔" | "符号" | "未定义" | "对象" | "功能"'和'" null"'。

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

1 个答案:

答案 0 :(得分:10)

这不是typeof的作用!

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

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

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

糟糕!我该怎么办?

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

  • 要测试null,请使用expr === null。如果您的同事允许您使用expr == null
  • ,则可以使用惯用语undefined来测试null==
  • 要测试数组,请使用Array.isArray(expr)。请注意,您期望成为阵列的某些内容(例如document.getElementsByTagName("div"))不会(getElementsByTagName返回NodeList),所以要小心
  • 要测试班级类型,请使用expr instanceof ClassName

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

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

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

*古代浏览器(IE8)中查询某些异域浏览器对象的typeof时,您可能会获得其他值,但没有现代JavaScript引擎可以执行此操作。