如果函数返回可以引发异常,则应返回“ never”

时间:2018-10-22 16:12:17

标签: typescript

如果我有一个通常情况下返回值但可以抛出异常的函数,原型应该是什么样?应该包含| never(例如,其正常返回类型和never的并集)吗?

例如,是否有理由执行以下操作?如果没有别的,似乎可能会指出将来的编码人员可能的例外。

function fn( n: number ) : number | never {
    if ( n < 0 ) throw ("badness");
    return n;
}

1 个答案:

答案 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配合使用,则会显示提示:

IntelliSense view

希望有帮助。祝你好运!