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

Eri*_*son 3 typescript

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

如果不求助于 if 情况,Typescript 似乎无法理解这一点。有什么办法可以实现这一点吗?

请参阅下面的代码以进行说明:

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
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

您可以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;
}
Run Code Online (Sandbox Code Playgroud)

或者,if(但是……哎呀,它表明该方法将返回,而实际上它会抛出):

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