接口不能添加到基本接口中的成员类型(至少不能直接添加).可以改用交叉点类型:
export interface Module {
name: string;
data: any;
structure: {
icon: string;
label: string;
}
}
export type DataModule = Module & {
structure: {
visible: boolean;
}
}
export type UrlModule = Module & {
structure: {
url: string;
}
}
let urlModule: UrlModule = {
name: "",
data: {},
structure: {
icon: '',
label: '',
url: ''
}
}
它们的行为应该类似于接口,它们可以由类实现,当您为它们分配对象文本时,它们将得到判断.
您也可以使用接口来实现这一点,但它有点冗长,并且意味着使用类型查询来获取字段的原始类型,以及一个交集:
export interface DataModule extends Module {
structure: Module['structure'] & {
visible: boolean;
}
}
export interface UrlModule extends Module {
structure: Module['structure'] & {
url: string;
}
}
真正详细的选项(虽然在某些方面更容易理解)当然是为 struct 定义一个单独的接口:
export interface IModuleStructure {
icon: string;
label: string;
}
export interface Module {
name: string;
data: any;
structure: IModuleStructure
}
export interface IDataModuleStructure extends IModuleStructure{
visible: boolean;
}
export interface DataModule extends Module {
structure: IDataModuleStructure
}
export interface IUrlModuleStructure extends IModuleStructure {
url: string;
}
export interface UrlModule extends Module {
structure: IUrlModuleStructure
}
let urlModule: UrlModule = {
name: "",
data: {},
structure: {
icon: '',
label: '',
url: ''
}
}
Edit
根据pe@jcalz的建议,我们还可以使模块接口通用,并传递适当的 struct 接口:
export interface IModuleStructure {
icon: string;
label: string;
}
export interface Module<T extends IModuleStructure = IModuleStructure> {
name: string;
data: any;
structure: T
}
export interface IDataModuleStructure extends IModuleStructure{
visible: boolean;
}
export interface DataModule extends Module<IDataModuleStructure> {
}
export interface IUrlModuleStructure extends IModuleStructure {
url: string;
}
export interface UrlModule extends Module<IUrlModuleStructure> {
}
let urlModule: UrlModule = { // We could also just use Module<IUrlModuleStructure>
name: "",
data: {},
structure: {
icon: '',
label: '',
url: ''
}
}