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

时间:2017-08-26 14:50:54

标签: typescript types

我不希望将特定函数作为参数传递给另一个函数,但是根据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 个答案:

答案 0 :(得分:1)

简答

  

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

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

never

的详细信息

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参数类型为string。这是spoken参数。

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

由于arg1stringstringnever的超类型,因此以下分配有效。

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

spokenParam = spoken;