打字稿覆盖通用方法

时间:2020-02-10 21:04:18

标签: typescript typescript-generics

如何重载具有具体类型的泛型方法? 如果我在类级别(即Foo)上指定R而不在方法级别指定R,则似乎可行。

class Foo {
    find<R>(arg: R[]): R[] {
        return arg;
    }
}

class Bar extends Foo {
    find(arg: string[]) {
        return super.find(arg);
    }
}

给出以下错误

类型为“ Bar”的属性“查找”不能分配给基本类型为“ Foo”的相同属性。 类型'(arg:string [])=> string []'不能分配给类型'(arg:R [])=> R []'。 参数“ arg”和“ arg”的类型不兼容。 类型“ R []”不可分配给类型“字符串[]”。 无法将类型“ R”分配给类型“字符串”。(2416)

1 个答案:

答案 0 :(得分:1)

编译器不允许它,否则它将在类型系统中创建一个孔。请考虑以下内容:

function findNumbers(obj: Foo) {
    return obj.find([1, 2, 3]);
}

findNumbers(new Bar());

findNumbers应该接受Bar的实例(因为Bar extends Foo),但是Bar.prototype.find仅可以接受string[],而Foo.prototype.find可以接受任何数组。在TypeScript的类型系统中,子类的实例应该能够执行超类实例可以执行的所有操作。在您的示例中,Bar.prototype.find无法接受number[],而Foo.prototype.find可以。因此,您的Bar将不是Foo的有效子类。