【发布时间】:2021-07-07 16:20:42
【问题描述】:
我有一个这样定义的类
class Foo {
value: string | null;
constructor(){
this.value = null;
}
private ensureValueExists():this.value is string{ //type predicate is not legal
this.value = "bar";
return true;
}
doStuffWithValue(){
this.ensureValueExists();
return 5 + this.value; //ERROR, this.value can be null
}
}
我希望 ensureValueExists 方法能够告诉编译器 this.value 确实是一个字符串并且可以安全使用。 是否有特殊的语法可以使用,或者目前对于 TS 方法是否不可行?
【问题讨论】:
-
this.value ??= "bar"; -
我希望我的类型谓词能够工作,所以我不必到处添加警卫。
-
如果您可以确保
value稍后会被初始化,但在“真实代码”(非初始化代码)访问它之前仍然可用,那么您可以将其记为value!: string。如果你想要空安全访问,你可以说this.value ?? "fallback"。如果您想确保生成一个对象,其中value被视为非空,您可以有一个单独的接口。在这里很难说哪个是正确的选择。 -
“我希望我的类型谓词起作用,所以我不必到处添加警卫。”但是你仍然需要在任何地方添加断言
-
我不明白,使用 jcalz 的解决方案,它可以在没有非空断言的情况下工作。
标签: typescript types predicate