Typescript 为什么可以';我不能对联合类型的变量调用方法吗?

Typescript 为什么可以';我不能对联合类型的变量调用方法吗?,typescript,union-types,Typescript,Union Types,出乎意料的是,当我试图对联合类型的变量调用方法时,我遇到了一个编译器错误。我已经隔离了这个问题,请参见下面的代码。我想知道是什么阻止编译器理解baz应该是string。这是某种边缘情况,只是没有实现(尚未?)在编译器?或者,该代码无效的根本原因是什么 TypeScript版本:2.0.6 错误是:无法调用其类型缺少调用签名的表达式。 declare class A { foo(arg: number[] | number): string; } declare class B {

出乎意料的是,当我试图对联合类型的变量调用方法时,我遇到了一个编译器错误。我已经隔离了这个问题,请参见下面的代码。我想知道是什么阻止编译器理解
baz
应该是
string
。这是某种边缘情况,只是没有实现(尚未?)在编译器?或者,该代码无效的根本原因是什么

TypeScript版本:2.0.6

错误是:
无法调用其类型缺少调用签名的表达式。

declare class A {
    foo(arg: number[] | number): string;
}

declare class B {
    foo(arg: number[]): string;
}

declare let bar: A | B;

let baz = bar.foo([3000]);
()


如果我在类
A
中使用方法重载而不是联合类型,它就会开始工作。然而,我的问题是真正的
A
B
是在相对难以更改的第三方类型定义中定义的

您可能希望
bar.foo
的类型为:

(arg: number[] | number) => string;
但事实上:

((arr: number | number[]) => string) | ((arr: number[]) => string)

这种类型确实是不可调用的

如果将
B
更改为:

declare class B {
    foo(arr: number[] | number): string;
}
然后错误消失了(您可以明显地更改
A.foo
以匹配
B


编辑 类型:

((arr: number | number[]) => string) | ((arr: number[]) => string)
不可调用,因为编译器不引用应调用其中哪一个函数。
如果它能够引用,那么它将以类型
(arg:number[]| number)=>string
开头

这样做的原因是:

declare class A {
    foo(arg: number): string;
    foo(arg: number[]): string;
}
现在类型
A | B
有一个通用方法:
foo(arg:number[]):string


因此,
bar.foo
的类型是
(arr:number[])=>string
,没有像以前那样的冲突。

“而且这个类型确实是不可调用的。”为什么不可以呢?在我看来,编译器可以足够聪明地理解这两个定义(我的初始版本和带有重载的)实际上是一样的。但我可能错过了一些重要的原因,让这一切不会发生。我想知道GitHub上的TS项目是否已经讨论过这一点。我不确定为什么编译器在这些情况下不够聪明。试着打开一个话题,看看他们怎么说