网站搜索

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() 方法上会收到 TypeScript 的错误?我期望 TypeScript 能知道当我只传一个类型为 A 的参数时,它应该返回一个字符串。

答案#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';

    }
}