考虑以下代码:
let str: string | null;
function print(msg: string) {
console.log(msg);
}
print(str);
在这种情况下,打字稿编译器给我一个错误,正确地指出'string |类型的参数。 “ null”不能分配给“ string”类型的参数。
这可以简单地检查 str 是否存在,所以
let str: string | null;
function print(msg: string) {
console.log(msg);
}
if (str) {
print(str);
}
编译没有错误。打字稿编译器我足够聪明,可以理解检查。
现在假设您检查方法中变量的存在,例如
let str: string | null;
function print(msg: string) {
console.log(msg);
}
function check(str: string) {
return str != null;
}
if (check(str)) {
print(str);
}
在这种情况下,typescrip无法理解对 print 方法的调用是安全的。 我该如何解决?
编辑
需要明确的是,这(或多或少)是我班上的同学们。
好的,但是我的情况要复杂一些。 这或多或少是我班级的结构:
class Clazz {
private myProp: {
aString?: string
anotherString?: number
};
constructor(aParam: any) {
this.myProp = {};
if (aParam.aString) {
this.myProp.aString = aParam.aString;
}
if (aParam.anotherString) {
this.myProp.anotherString = aParam.anotherString;
}
}
public haveAString() {
return this.myProp.aString != null;
}
public haveAnotherString() {
return this.myProp.anotherString != null;
}
public computation1() {
if (this.haveAString()) {
this.doAComputation(this.myProp.aString);
}
}
public computation2() {
if (this.haveAnotherString()) {
this.doAComputation(this.myProp.anotherString);
}
}
private doAComputation(str: string) {
// do something with the string
}
}
我该如何解决?
答案 0 :(得分:2)
编译器不会在函数边界上进行检查,但是您可以使用自定义类型防护来达到相同的效果
let str: string | null;
function print(msg: string) {
console.log(msg);
}
function check(str: string| null) : str is string{
return str != null;
}
if (check(str)) {
print(str);
}