Typescript接口方法重载不起作用

时间:2018-10-02 05:34:02

标签: typescript

我有以下代码:

class A { }

class B { }

class C { }

interface Builder {
    build(paramOne: A): string;
    build(paramOne: B, paramTwo: C): number;
}

class Test implements Builder {
    build(a: A) {
      return 'string';
    }
}

为什么我在build()方法上的打字稿中遇到错误?我期望打字稿会知道,当我只传递一个类型为A的参数时,它应该返回一个字符串。

1 个答案:

答案 0 :(得分:1)

接口实现将需要具有接口要执行的公共重载。要为该方法指定实际的实现,您需要使用一个额外的实现签名:

class A { p: string }

class B { b: string}

class C { c: string}

interface Builder {
    build(paramOne: A): string;
    build(paramOne: B, paramTwo: C): number;
}

class Test implements Builder {

    build(paramOne: A): string;
    build(paramOne: B, paramTwo: C): number;
    build(paramOne: A|B, paramTwo?: C) : string | number {
    return 'string';
    }
}

new Test().build(new A()) // return string 
new Test().build(new B(), new C()) // returns number
new Test().build(new A(), new C())  // error implementation signature is not callable directly 

如果要避免再次指定重载,可以将函数实现为成员字段而不是方法,但这并不安全(我必须使用any作为返回类型来获取新函数与过载兼容)。使用字段(在实例上分配)而不是方法(在原型上分配)会带来性能影响

class Test implements Builder {

    build: Builder ['build'] = function (this: Test, paramOne: A|B, paramTwo?: C) : any {
        return 'string';

    }
}