переопределение машинописи метод generi c - PullRequest
0 голосов
/ 11 февраля 2020

Как перегрузить метод generi c конкретным типом? Это работает, если я указываю R на уровне класса ie Foo, но не на уровне метода.

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

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

Дает следующую ошибку

Свойство 'find' in type ' Бар 'нельзя назначить одному и тому же свойству в базовом типе' Foo '. Тип '(arg: string []) => string []' нельзя назначить типу (arg: R []) => R [] '. Типы параметров 'arg' и 'arg' несовместимы. Тип 'R []' нельзя назначить типу 'string []'. Тип 'R' нельзя назначить типу 'string'. (2416)

1 Ответ

1 голос
/ 11 февраля 2020

Компилятор не разрешает этого, иначе это создаст дыру в системе типов. Рассмотрим следующее:

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.

...