typescript 在类型脚本中声明一个方法抛出错误?

nvbavucw  于 2022-12-24  发布在  TypeScript
关注(0)|答案(4)|浏览(209)

以下代码编译时不会出现错误“声明类型既不是void也不是any的函数必须返回值或包含一个throw语句”。
有没有办法让编译器识别出_notImplemented抛出了异常?

function _notImplemented() {
   throw new Error('not implemented');
}

class Foo {
    bar() : boolean { _notImplemented(); }

我能看到的唯一的解决办法就是使用泛型。但这似乎有点古怪。有没有更好的方法?

function _notImplemented<T>() : T {
   throw new Error('not implemented');
}

class Foo {
    bar() : boolean { return _notImplemented(); }
nwo49xxi

nwo49xxi1#

可以使用Either而不是throwEither是一种通常保存错误或结果的结构。由于它是一种与其他类型类似的类型,因此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的函数可以选择将其展开、返回maybe本身、抛出error本身或其他选项。
你需要选择一个包含Either的库--看看像TsMonadmonet.js这样的monad库。

z9ju0rcb

z9ju0rcb2#

您可以指定_notImplemented返回never类型。never是从不返回的函数的特殊类型。这可能是因为无限循环或因为它总是抛出错误。

function _notImplemented() : never {
     throw new Error("not Implemented")
}
iezvtpos

iezvtpos3#

AFAIK目前没有非黑客的方法来处理这个问题。
TypeScript团队目前正在github(https://github.com/Microsoft/TypeScript/issues/1042)上对此进行检查,我们可能很快就会有一些解决方案。

kcugc4gi

kcugc4gi4#

出于此检查的目的,我们应该在enter image description here中将 throw 视为与 return 等效

相关问题