我正在使用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.
}
有什么办法告诉打字稿吗?因为有时像这样的方法比将属性与未定义自身进行比较要干净。
谢谢
答案 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
的类型将有效地someProperty
从someProperty
的类型User['someProperty'] & string = (string | undefined) & string = string
中删除undefined
结果类型。
答案 1 :(得分:-1)
您可能想要更改:
myUser.someProperty != undefined
收件人
typeof myUser.someProperty !== "undefined"
这将检查类型而不是值。