Я хотел бы заставить дочерние объекты быть определенным интерфейсом или расширяться от этого интерфейса.
Например:
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
?
Я предполагаю, что вы имели в виду, что каждый вложенный объект будет и данным интерфейсом и интерфейсом 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
создаст пересечение, которое очень похоже на наследование интерфейса
Решение вопроса состоит в том, чтобы добавить в дополнение ко всем значениям определение: [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
}
Заставлять детей это элегантно. Я рекомендую вам прекратить это.
Home
не расширяетPage
? Можете ли вы включить код, который показывает, что вы хотели бы видеть, чтобы компилирование без ошибок и что вы хотели бы видеть, чтобы компилирование с ошибками?Home
уже расширяетPage
потому что вы написалиinterface Home extends Page
. Что еще тебе нужно? Как примечание, назовите свои интерфейсыIPage
,IHome
и т. Д., Чтобы отличать их от типов классов. Кроме того, посколькуHome
простирается отPage
, нет необходимостиdisplayName
в обоих. Возьми это изHome
. Есть ли другие свойства в этих интерфейсах, ваш код кажется слишком упрощенным. вставить больше и дать больше объяснений.