gscraft
@gscraft
Программист, философ

Как объявить дочерний тип, т.е. тип, обязательно наследующий базовый?

Вопрос, полагаю, тривиальный, но, пролистав документацию, ответ не нашел. Нужно в интерфейсе или классе объявить свойство, которое должно быть унаследовано от базового. В некоторых языках это решается объявлением базового же типа. Например:
interface Foo { }
class A implements Foo { }
class B { }

interface Baz {
  someField: Foo; // поле должно наследовать Foo
}

const b: Baz = {
  someField: new B(); // ошибка
};

UPD более наглядный пример:
interface Foo { a: number; }
interface Bar extends Foo { b?: number; }
interface Baz extends Foo { c: number; }

class B implements Bar { /* interface release */ }
class C implements Baz { /* interface release */ }

interface X { instance: Bar; }
{ instance: new C() } as X;
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
bingo347
@bingo347 Куратор тега TypeScript
Crazy on performance...
И где ошибка?

А вообще, если правильно понял вопрос, Вам нужны дженерики:
class Bar<T extends Foo> {
  someField: T; // это поле может быть A, B и обязано произойти от Foo
}

interface Baz<T extends Foo> {
  someField: T;
}


UPD:
Я ищу способ однозначно ограничить по предку на уровне типа

Можно такой хинт провернуть:
declare const hint: unique symbol;

class Foo {
    protected [hint]: never;
}

interface IFoo extends Foo {}

class A extends Foo implements IFoo {}

class B { }

interface Baz {
  someField: IFoo;
}

const a: Baz = {
  someField: new A(), // нет ошибки
};

const b: Baz = {
  someField: new B(), // ошибка
};
https://www.typescriptlang.org/play?jsx=0#code/CYU...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы