【问题标题】:should function returns include "never" if they can throw an exception如果可以抛出异常,函数返回是否应该包括“从不”
【发布时间】:2018-10-22 16:12:16
【问题描述】:

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

例如,是否有理由执行以下操作?如果不出意外,它似乎可能会为未来的编码人员指出可能的例外情况。

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

【问题讨论】:

标签: typescript


【解决方案1】:

这并没有什么坏处,但这样做没有多大意义。 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 的编辑器,则会显示提示:

希望对您有所帮助。祝你好运!

【讨论】:

  • 非常有帮助,谢谢!我不能投票给你,因为我的代表太低了:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2012-06-28
  • 1970-01-01
相关资源
最近更新 更多