Как заставить детей объекта быть определенным интерфейсом или расширяться от этого интерфейса?

1

Я хотел бы заставить дочерние объекты быть определенным интерфейсом или расширяться от этого интерфейса.
Например:

export interface Configuration {
  pages: {
    home: IHome;
    about: IAbout; // I want IAbout will have to extends IPage
    contact: IPage;
  };
}
interface IPage {
  displayName: string;
}

interface IHome extends IPage {
  slider: any; // property that only Home has
}

interface IAbout { // How to force this interface to extends IPage like IHome interface
  map: any; // property that only About has
}

Как я могу заставить IAbout extends IPage?
Я знаю метод [pageName: string]: IPage, но он не заставляет IPage extends IPage.
Есть ли способ обеспечить, что значения будут наследоваться от IPage?

  • 0
    Я не понимаю, о чем ты спрашиваешь. Что вы имеете в виду, что Home не расширяет Page ? Можете ли вы включить код, который показывает, что вы хотели бы видеть, чтобы компилирование без ошибок и что вы хотели бы видеть, чтобы компилирование с ошибками?
  • 0
    Вы должны быть более понятным, Home уже расширяет Page потому что вы написали interface Home extends Page . Что еще тебе нужно? Как примечание, назовите свои интерфейсы IPage , IHome и т. Д., Чтобы отличать их от типов классов. Кроме того, поскольку Home простирается от Page , нет необходимости displayName в обоих. Возьми это из Home . Есть ли другие свойства в этих интерфейсах, ваш код кажется слишком упрощенным. вставить больше и дать больше объяснений.
Показать ещё 9 комментариев
Теги:
typescript-typings

3 ответа

0

Я предполагаю, что вы имели в виду, что каждый вложенный объект будет и данным интерфейсом и интерфейсом IPage.

Вы можете использовать пересечение с IPage и сопоставленный объект с вычисленными ключами.


type ChildrenWithIPage<T extends object> = {
  [key in keyof T]: T[key] & IPage;
};

export interface Configuration {
  pages: ChildrenWithIPage<{
    home: IHome;
    about: IAbout;
    contact: IPage;
  }>;
}
interface IPage {
  displayName: string;
}

interface IHome {
  slider: any;
}

interface IAbout {
  map: any;
}

Использование [key in keyof T] будет перебирать все ключи T, T[key] будет возвращать значение в key свойства, а & IPage создаст пересечение, которое очень похоже на наследование интерфейса

0

Решение вопроса состоит в том, чтобы добавить в дополнение ко всем значениям определение: [pageName: string]: IPage, и поэтому каждому придется extends IPage

export interface Configuration {
  pages: {
    [pageName: string]: IPage
    home: IHome;
    about: IAbout; // Now IAbout will have to extends IPage
    contact: IPage;
  };
}
interface IPage {
  displayName: string;
}

interface IHome extends IPage {
  slider: any; // property that only Home has
}

interface IAbout { // now IAbout will have to extends IPage
  map: any; // property that only About has
}
-8

Заставлять детей это элегантно. Я рекомендую вам прекратить это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню