如果我有一个通常情况下返回值但可以抛出异常的函数,原型应该是什么样?应该包含| never
(例如,其正常返回类型和never
的并集)吗?
例如,是否有理由执行以下操作?如果没有别的,似乎可能会指出将来的编码人员可能的例外。
function fn( n: number ) : number | never {
if ( n < 0 ) throw ("badness");
return n;
}
答案 0 :(得分:0)
这没有什么坏处,但是这样做没有什么意义。 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注释来提示可能的例外情况。
/** 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配合使用,则会显示提示:
希望有帮助。祝你好运!