typescript 为什么在使用箭头函数时不使用控制流对窄类型进行类型脚本化

vs3odd8k  于 2023-03-04  发布在  TypeScript
关注(0)|答案(1)|浏览(128)

Typescript拒绝通过调用fail来缩小,但会通过调用fail2来缩小。这是typescript中的bug吗?

const fail = (message?: string): never => {
    throw new Error(message);
};

function fail2(message?: string): never {
    throw new Error(message);
}

const getData = (): string | null => {
    return "the-data";
}


export const loadDataOrError = (): string => {
    const data = getData();

    if (data === null) {
        // Swap the below and see that it works
         
        // fail2();
        fail();
    }

    // This errors
    return data;
};

如果您想尝试切换注解并看到错误消失,这里是一个Playground。

屏幕截图以便于说明
出现错误

无错误

yjghlzjz

yjghlzjz1#

根据this open GitHub问题,这是当前类型收缩在typescript中工作的一个限制。如果你想纠正它,你可以显式地注解箭头函数类型,如下所示:

const fail: (message?: string) => never = (message) => {
    throw new Error(message)
}

相关问题