打字稿变量存在性检查

时间:2018-08-27 11:17:46

标签: typescript

考虑以下代码:

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
    }

}

我该如何解决?

1 个答案:

答案 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);
}