以下版本不会编译错误“声明类型既不是void也不必返回值或由单个throw语句组成的函数”。
有没有办法让编译器识别出_notImplemented会抛出异常?
function _notImplemented() {
throw new Error('not implemented');
}
class Foo {
bar() : boolean { _notImplemented(); }
我唯一能看到的就是使用泛型。但它看起来有点像hacky。还有更好的方法吗?
function _notImplemented<T>() : T {
throw new Error('not implemented');
}
class Foo {
bar() : boolean { return _notImplemented(); }
答案 0 :(得分:5)
你可以使用Either而不是throw。
Aither是一种通常包含错误或结果的结构。因为它是一个类似于其他类型的类型,所以TypeScript可以轻松地使用它。
例如:
function sixthCharacter(a: string): Either<Error, string> {
if (a.length >= 6) {
return Either.right<Error, string>(a[5]);
}
else {
return Either.left<Error, string>(new Error("a is to short"));
}
}
使用函数sixthCharacter
的函数可以选择打开它,返回一个可能本身,自己抛出错误或其他选项。
你需要选择一个包含Either的库 - 看一下像TsMonad或monet.js这样的monad库。
答案 1 :(得分:1)
AFAIK目前还没有非hacky方式如何处理这个问题。
目前正由github上的TypeScript团队(https://github.com/Microsoft/TypeScript/issues/1042)对此进行检查,我们很快就会有一些解决方案。
答案 2 :(得分:0)
您可以指定_notImplemented返回类型never
never是永不返回的函数的特殊类型。可能是因为死循环或总是抛出错误。
function _notImplemented() : never {
throw new Error("not Implemented")
}