首页 文章

TypeScript忽略类型为never的可选参数

提问于
浏览
1

我不希望将特定函数作为参数传递给另一个函数,但是根据TypeScript它是有效的,但是它呢?为什么?

这是代码示例:

function spoken(nope?: never): void {
    console.log("He has spoken.");
}

function speak(toSay: string, spoken: (arg1: string) => void): void {
    console.log("He says: " + toSay);
    spoken("He has spoken.");
}

speak("Hello world.", spoken);

因为基本上,TypeScript说类型字符串可以分配给类型never,因为如果nope是说类型号,TypeScript会抱怨因为类型字符串与类型号不兼容 .

1 回答

  • 1

    简答

    ...根据TypeScript它是有效的,但是它?为什么?

    是的,它是有效的,因为TypeScript说类型 never 可以分配给 string 类型 . 这是some code in typescript/play来演示 .

    永远的细节

    Basic Types documentation说:

    never类型是每种类型的子类型,并且可分配给每种类型;但是,没有类型是永远的子类型或可分配的(从不自己除外) .

    这意味着我们可以将 never 分配给 string 但不能将 string 分配给 never .

    let arg1: string = (null as never); // works
    let arg2: never = (null as string); // fails
    

    您的情况详情

    您的 speak 函数有一个名为 spoken 的参数,该参数具有 arg1 类型的 arg1 参数 . 这是 spoken 参数 .

    let spokenParam: (arg1: string) => void;
    

    由于 arg1stringstringnever 的超类型,因此以下赋值有效 .

    function spoken(nope?: never): void {
        console.log("He has spoken.");
    }
    
    spokenParam = spoken;
    

相关问题