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项目是否已经讨论过这一点。我不确定为什么编译器在这些情况下不够聪明。试着打开一个话题,看看他们怎么说