检查空/未定义的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()
}