这并没有什么坏处,但这样做没有多大意义。 never 充当没有可能值的bottom type,并且被编译器积极地removed from unions:
因为never 是每个类型的子类型,它总是在联合类型中被省略,并且在函数返回类型推断中被忽略,只要有其他类型被返回。
这意味着如果您使用IntelliSense 之类的内容检查您的函数,它将显示为:
function fn(n: number): number
因此,未来的编码人员甚至不太可能注意到其中的差异。在实践中,没有区别,因为很难保证在某个函数中不能抛出异常。
一种更安全但更烦人的方法是在返回类型中编码可能的失败而不依赖异常,例如:
function fn( n: number ) : number | undefined {
if ( n < 0 ) return undefined;
return n;
}
甚至更详细但非常明确的意图:
type Success<T> = { success: true, value: T };
type Error<E> = { success: false, error: E };
function fn(n: number): Success<number> | Error<string> {
if (n < 0) return { success: false, error: "badness" };
return { success: true, value: n };
}
这真的取决于你的用例。
我可能会保留您原来的原样并使用JSDoc cmets 来提示可能的异常。
/** Returns n if n is non-negative, throws an exception otherwise */
function fn(n: number): number | never {
if (n < 0) throw ("badness");
return n;
}
如果您使用带有IntelliSense 的编辑器,则会显示提示:
希望对您有所帮助。祝你好运!