如何让Typescript了解在value值为null的函数调用后值不能为null

时间:2018-10-03 14:41:57

标签: typescript

我有一个检查值是否不为null的函数,如果值不为null则抛出该函数。如果它没有抛出并成功返回,我知道该值不可能为null。

Typescript似乎不依靠if案例就无法理解这一点。有什么办法可以做到这一点?

有关说明,请参见下面的代码

function ensureNotNull<T>(arg: T | null, paramName: string): arg is Exclude<typeof arg, null> {
    if (arg === null) {
        throw new Error(`arg '${paramName}' is null`);
    }

    return true;
}

var value: string | null = null;

function doStuffIfValueNotNull(value: string | null) : void {
    ensureNotNull<string>(value, "value");
    var strLen = value.length; //Error with strictNullChecks
}

1 个答案:

答案 0 :(得分:4)

您可以使ensureNotNull返回非null并分配回去(用***标记的更改):

function ensureNotNull<T>(arg: T | null, paramName: string): T {
// *** ------------------------------------------------------^
    if (arg === null) {
        throw new Error(`arg '${paramName}' is null`);
    }

    return arg; // ***
}

var value: string | null = null;

function doStuffIfValueNotNull(value: string | null) : void {
    value = ensureNotNull<string>(value, "value");
//  ^^^^^^^^---- ***
    var strLen = value.length;
}

或者,if(但是...有点问题,它表明该方法实际上将在抛出时返回):

function doStuffIfValueNotNull(value: string | null) : void {
    if (!ensureNotNull<string>(value, "value")) return;
    var strLen = value.length; //Error with strictNullChecks
}