用于检查null / undefined的Typescript函数

时间:2019-06-27 13:58:30

标签: typescript

我正在使用VS Code,在与Typescript一起使用时,它会很有帮助,因为它可以告诉您当前存在的问题而无需进行转换。 我在Typescript中使用nodeJS,效果很好。

我唯一遇到的问题就是所谓的“空/未定义检查功能”。

请参见以下示例:

class User {
   public someProperty: string | undefined;
   // ...

   public get canDoSomething() {
      return this.someProperty != undefined;
   }
}
let myUser: User = ...

这很好用:

if (myUser.someProperty != undefined) {
   // at this point myUser.someProperty is type string only (as it cannot be undefined anymore
}

但是这失败了

if (myUser.canDoSomething) {
   // because typescript still thinks that myUser.someProperty is string | undefined and not just string, even though this method checks for that.
}

有什么办法告诉打字稿吗?因为有时像这样的方法比将属性与未定义自身进行比较要干净。

谢谢

2 个答案:

答案 0 :(得分:3)

类型缩小适用于特定的语法结构。 if (obj.prop != undefined)就是这样的一种构造,它将通知编译器prop不能被不确定。

在您的情况下,您可以在属性中执行检查。 Typescript不会跟随getter的实现来查看它是否执行null检查。

您可以使用自定义类型防护(具有特殊语法的方法/函数,可告知编译器类型副作用)

class User {
   public someProperty: string | undefined;

   public canDoSomething() : this is this & { someProperty: string} {
      return this.someProperty != undefined;
   }
}
let myUser: User = new User

if (myUser.canDoSomething()) {
    myUser.someProperty.big()
}

我建议还是坚持使用简单的if (myUser.someProperty != undefined),除非您有充分的理由封装支票。

修改

this is this & { someProperty: string}通知编译器,此方法所调用的对象的类型(this已更改(is)为新类型(交集{{1} }。

交集this & { someProperty: string}中的

this充当当前类的类型(称为多态this & { someProperty: string}),将是this或从用户派生的任何类(本可以使用User而不是User,但不适用于派生类。

与(this的交集(&)意味着检查后的类型既是我们之前拥有的类({ someProperty: string})也是具有属性{{1}的对象},类型为this。由于someProperty已经具有string,因此在此交集中,User的类型将有效地somePropertysomeProperty的类型User['someProperty'] & string = (string | undefined) & string = string中删除undefined结果类型。

答案 1 :(得分:-1)

您可能想要更改:

myUser.someProperty != undefined

收件人

typeof myUser.someProperty !== "undefined"

这将检查类型而不是值。