我不希望将特定函数作为参数传递给另一个函数,但是根据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会抱怨因为类型字符串与类型号不兼容。
答案 0 :(得分:1)
...根据TypeScript它是有效的,但是它呢?为什么?
是的,它是有效的,因为TypeScript说类型never
可以分配给string
类型。以下是some code in typescript/play来演示。
never
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;
由于arg1
是string
且string
是never
的超类型,因此以下分配有效。
function spoken(nope?: never): void {
console.log("He has spoken.");
}
spokenParam = spoken;