【发布时间】:2021-04-23 13:23:26
【问题描述】:
基于this question,我有以下具有条件返回类型的函数:
function foo(arg: false): string
function foo(arg: true): number
function foo(arg: boolean): string | number {
return arg ? 1 : 'hello'
}
function bar(arg: false): string
function bar(arg: true): number
function bar(arg: boolean) {
return foo(arg)
}
但是,此代码无法在 return foo(arg) 行上编译并出现此错误:
No overload matches this call.
Overload 1 of 2, '(arg: false): string', gave the following error.
Argument of type 'boolean' is not assignable to parameter of type 'false'.
Overload 2 of 2, '(arg: true): number', gave the following error.
Argument of type 'boolean' is not assignable to parameter of type 'true'. ts(2769)
The call would have succeeded against this implementation, but implementation signatures of overloads are not externally visible.
我发现我可以通过将bar 更改为:
function bar(arg: boolean) {
return arg ? foo(arg) : foo(arg)
}
但这给我的函数体增加了一个多余的三元条件。有没有更多“正确”/优雅的方法来解决这个问题?
【问题讨论】:
-
如果您打算使用
foo(arg: boolean): string | number之类的签名调用该函数,那么您需要将其声明为重载签名之一 - 它是实现签名不这样做。 -
@kaya3 我打算用
bar(true)调用bar,返回number或bar(false),返回string。这是一个人为的最小示例,因此看起来很荒谬,但在现实世界的应用程序中,我有一个更复杂的功能。 -
foo是需要bar函数想要调用它的签名的那个。
标签: typescript