检查空/未定义的Typescript函数
我使用的是检查空/未定义的Typescript函数,typescript,Typescript,我使用的是VS code,它在使用Typescript时非常有用,因为它可以告诉您当前存在的问题,而不需要进行传输。 我将Typescript与nodeJS一起使用,效果非常好 我唯一的问题就是所谓的“空/未定义的检查函数” 请参见此示例: 类用户{ 公共属性:字符串|未定义; // ... 公共获取方法(){ 返回this.someProperty!=未定义; } } 让我的用户:用户=。。。 这很有效: if(myUser.someProperty!=未定义){ //此时,myUser.
VS code
,它在使用Typescript
时非常有用,因为它可以告诉您当前存在的问题,而不需要进行传输。
我将Typescript
与nodeJS
一起使用,效果非常好
我唯一的问题就是所谓的“空/未定义的检查函数”
请参见此示例:
类用户{
公共属性:字符串|未定义;
// ...
公共获取方法(){
返回this.someProperty!=未定义;
}
}
让我的用户:用户=。。。
这很有效:
if(myUser.someProperty!=未定义){
//此时,myUser.someProperty仅为string类型(因为它不能再未定义)
}
然而,这失败了
if(myUser.candomething){
//因为typescript仍然认为myUser.someProperty是string |未定义的,而不仅仅是string,即使该方法检查了这一点。
}
知道我该如何告诉typescript吗?因为有时候这样的方法比将属性与未定义的自身进行比较更干净
谢谢您可能需要更改:
myUser.someProperty!=未定义
到
typeof myUser.someProperty!=“未定义”
这将检查类型而不是值。类型缩小适用于特定的语法结构。如果(obj.prop!=undefined)
是这样的结构之一,则会通知编译器prop
不能未定义
在您的例子中,您在property.Typescript中执行检查时,不会跟随getter的实现来查看它是否执行空检查
您可以使用自定义类型保护(具有特殊语法的方法/函数,用于通知编译器类型的副作用):
我建议使用更简单的if(myUser.someProperty!=undefined)
,除非您有充分的理由封装检查
编辑
this is this&{someProperty:string}
通知编译器,调用此方法的对象的类型(this
)现在已更改(is
)为新类型(交叉点this&{someProperty:string}
)
this
交叉点中的this&{someProperty:string}
充当当前类(称为多态this
)的类型,并且将是User
或从User派生的任何类(可以使用User
而不是this
,但它在派生类上不起作用
与{someProperty:string}
的交集(&
)意味着检查后的类型是我们之前拥有的任何类(this
)而一个对象的属性someProperty
类型为string
。由于User
已经拥有someProperty
,因此该交集中someProperty
的类型将计算为User['someProperty']&string=(string |未定义)&string=string
有效地从结果类型中的someProperty
类型中删除未定义的。最后一个if
语句不应该是:if(myUser.candomething())
?没有括号,你不是在调用类型保护,只是检查函数是否定义。从TypeScript的角度来看,someProperty
仍然可以是未定义的@MehmetSeckin不,它是一个类属性,而不是一个方法,注意get
啊,对了,我不好。我刚刚意识到它是一个类属性属性。您可以使用isNullOrUndefined(值)myUser.someProperty!=undefined
才是有效的。第二个不起作用也没关系。如果变量的类型为undefined
,则该变量将具有原始值undefined
。现代浏览器不允许覆盖undefined
-类型。但是propertyName!==undefined
比…
的类型短,所以我更喜欢它。@MuratKaragöz我添加了一个解释,希望它能让事情更清楚一点
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()
}