Как определить тип «подкласс класса»? - PullRequest
0 голосов
/ 02 мая 2020
class SuperClass { ... }

class SubClass1 extends SuperClass { ... }
class SubClass2 extends SuperClass { ... }
class SubClass3 extends SuperClass { ... }

const foo: ??? = ...

Для foo Я хотел бы указать тип, который означает, что foo является экземпляром любого класса, расширяющего SuperClass. Я знаю, что мог бы использовать типы объединения и перечислить все подклассы, но должен быть лучший способ. Каким-то образом с extends или как это сделать?


Обновление:

Причина, по которой я спрашиваю это, заключается в том, что у меня есть эта проблема:

type SomeType = { foo: SuperClass };

public someMethod<T extends SuperClass>() {

  const bar: SomeType = ... ;

  const someSet: Set<T> = new Set();

  someSet.add(bar.foo);

Аргумент типа 'SuperClass' не может быть назначен параметру типа 'T'. «Суперкласс» может быть назначен ограничению типа «Т», но экземпляр «Т» может быть создан с другим подтипом ограничения «Суперкласс».

Хмм .. возможно, я должен просто изменить Set<T> до Set<SuperClass>.

Ответы [ 3 ]

1 голос
/ 02 мая 2020

Если вы действительно хотите иметь общий c тип, самый близкий ответ, который я могу придумать, это:

interface SuperClass {
    a: string;
}

type SomeType<T extends SuperClass> = { foo: T };

function someMethod<T extends SuperClass>(bar: SomeType<T>) {
    const someSet: Set<T> = new Set();

    someSet.add(bar.foo);
}
1 голос
/ 02 мая 2020

Это один из вариантов:

interface Interface {}

class SuperClass implements Interface{  }

class SubClass1 extends SuperClass {  }

const foo: Interface = new SubClass1();
0 голосов
/ 02 мая 2020

Чего вы хотите достичь? SuperClass должно быть хорошо для ???. Если вы хотите, чтобы это был союз КАЖДЫХ подклассов SuperClass: Ну, это невозможно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...