Rya*_*ugh 22
为了增加Lee的非常好的答案,另一种思考方式是在正确类型的程序中,无法观察到never值.
除了永不返回的函数(或者总是抛出异常的函数)之外,never当联合类型已经用尽其所有可能的成分时,您将看到类型:
// Example assumes --strictNullChecks
function fn(x: number | string) {
if (typeof x === 'number') {
// x: number in this block
} else if (typeof x === 'string') {
// x: string in this block
} else {
// x: never in this block
// this block does not run; the value of x cannot be observed
}
}
Run Code Online (Sandbox Code Playgroud)
Lee*_*Lee 21
在命令式语言中,void可以将其视为包含单个值的类型.这些语言不提供构造或使用此值的方法,但void可以将函数视为返回此微不足道的值.
相反,never是一个不包含值的类型,这意味着具有此返回类型的函数根本无法正常返回.这意味着抛出异常或未能终止.
Waj*_*ath 11
正如Marius Schulz 在本文中讨论的那样,
- 未显式返回值的函数会隐式返回
undefinedJavaScript 中的值。尽管我们通常说这样的函数“不返回任何内容”,但它会返回。在这些情况下,我们通常会忽略返回值。这样的函数void在 TypeScript 中被推断具有返回类型。- 具有
never返回类型的函数永远不会返回。它也不会返回undefined。该函数没有正常完成,这意味着它会抛出错误或根本没有完成运行。
从来没有信息表明该特定部分不应该访问。例如在这段代码中,
function do(): never {
while (true) {}
}
Run Code Online (Sandbox Code Playgroud)
你有一个无限循环,我们不想迭代无限循环。就这么简单。
但真正的问题是它对我们有何用处?例如,在创建更高级的类型时指出它们不是什么可能会有所帮助
例如,让我们声明我们自己的 NonNullable 类型:
type NonNullable<T> = T extends null | undefined ? never : T;
Run Code Online (Sandbox Code Playgroud)
这里我们检查 T 是否为空或未定义。如果是的话,我们就指出它永远不应该发生。然后在使用这种类型时:
let value: NonNullable<string>;
value = "Test";
value = null; // error
Run Code Online (Sandbox Code Playgroud)
void是这样的信息:该类型的函数不返回任何值,但它们是可访问的并且可以使用。
该类型绝不意味着什么也没有发生。当类型保护无法发生时,或者总是抛出异常的情况下,使用它。无效和从不之间有区别。显式返回类型 never won\xe2\x80\x99t 的函数允许返回未定义,这与允许返回未定义的 void 函数不同。
\n\nfunction functionThrow(): never {\nthrow new Error("This function return never");\nRun Code Online (Sandbox Code Playgroud)\n\n}
\n\n例如,在下面的代码中,有一个包含两个项目的枚举。TypeScript 知道只有两种情况可能发生,默认(其他)情况不会发生。TypeScript 的这种见解是完美的,因为函数返回类型只接受字符串,而不接受 never。如果将来您从枚举中添加新项目(例如,在 switch 语句中没有添加新 case 的 ChoiceC),则代码可以调用从不返回的 unhandledChoice 函数。
\n\n enum EnumWithChoices {\n ChoiceA,\n ChoiceB,\n ChoiceC,\n}\n\nfunction functionReturnStringFromEnum(c: EnumWithChoices): string {\n switch (c) {\n case EnumWithChoices.ChoiceA:\n return "A";\n case EnumWithChoices.ChoiceB:\n return "B";\n default:\n return unhandledChoiceFromEnum(c);\n }\n}\n\nfunction unhandledChoiceFromEnum(x: never): never {\n throw new Error("Choice not defined");\n}\nRun Code Online (Sandbox Code Playgroud)\n\n最后,never 表示不应该出现的状态。异常不是预期的行为。函数中的无限循环并不意味着在系统中是可持续的,从未访问过的条件不应该存在。
\n小智 6
另外,对于更多的理论原因,使用--strictNullChecks新标志,TypeScript需要一个新的底部类型(因为null并且undefined不再是).类型never是这样的底部类型,使TypeScript的类型系统更加一致.
小智 6
简而言之:
void返回void,never永不返回。
的返回类型Promise.reject()是Promise<never>,意思是“它永远不会被解析”。
因此,如果函数返回Promise<never>,我认为它只会返回错误。另一方面,Promise<void>解决问题可能没有任何价值。
| 归档时间: |
|
| 查看次数: |
7413 次 |
| 最近记录: |