如何强制对象的子级成为某个接口或从该接口扩展?

时间:2019-04-25 13:11:57

标签: typescript typescript-typings

我想强制对象的子级成为某个接口或从该接口扩展。
例如:

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
}

我如何强制IAboutextends IPage
我知道方法[pageName: string]: IPage, 但不会强制IPageextends IPage
有没有一种方法可以强制值继承自IPage

1 个答案:

答案 0 :(得分:1)

我猜你的意思是每个嵌套对象都是给定的接口和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将创建交集,其作用非常相似继承接口