如何在TypeScript

时间:2017-07-13 15:34:49

标签: typescript

我收到编译错误,我不确定原因。 (请注意,仅在TS 2.4.1中,2.3.4工作正常)下面是编译错误的示例。是的,你不应该在这种情况下创建一个重载,而只是函数签名的联合类型,但这是我可以创建的最简单的例子来显示问题:

class Animal {
    a: string;
}

class Dog extends Animal {
    b: string;
}

function test(func: (p: Dog) => any): any;
function test(func: (p: Animal) => any): any;
function test(func: (p: Animal) => any): any {

    return undefined;
}

我收到了TS2394编译器错误:

  

重载签名与功能实现不兼容

这一行:

function test(func: (p: Dog) => any): any;

更改函数定义以下解决了编译错误:

function test(func: (p: any) => any): any {

1 个答案:

答案 0 :(得分:1)

感谢@jcalz Joe Calzaretta,我已经明白了这一点(https://github.com/Microsoft/TypeScript/issues/17162)。

2.4介绍Strict contravariance for callback parameters从Joe复制:

  

致电(p:Dog)=>任何狗消费者,和(p:动物)=>任何一个   动物消费。请注意,每个动物消费者都是狗消费者   (因为消耗动物的东西会接受一只狗),但不是   每个狗消费者都是动物消费者(因为某些东西   消费狗可能不接受,比如,猫)。这意味着   狗消费者是动物消费者的超级类型。自一次过载   需要一个狗消费者,另一个需要一个动物消费者   实施应采取以下类型:狗消费者。

function test(func: (p: Dog) => any): any;
function test(func: (p: Animal) => any): any;
function test(func: (p: Dog | Animal) => any): any {

不行,因为你不能给狗消费者一只动物,它需要一只狗。表达方式的最类型的方法如下:

function test(func: (p: Dog) => any): any;
function test(func: (p: Animal) => any): any;
function test(func: ((p: Animal) => any) | ((p:Dog) => any)): any {

func可以是带动物的功能,也可以是带狗的功能。