建立组合接口阵列

时间:2019-01-03 09:38:48

标签: typescript interface

我正在寻找构建LDAP样式(对象类)数组接口结构的方法。 我尝试了多种方法来使用不同的接口,但是基本的想法是这样的……

export enum ObjectClassEnum {
    top = 'top',
    posixGroup = 'posixGroup',
    groupOfNames = 'groupOfNames',
}

export interface ILdapObject {
    objectClass: ObjectClassEnum[];
}

export interface ILdapObjectTop extends ILdapObject {
    objectClass: ObjectClassEnum.top[];
}

export interface ILdapObjectPosixGroup extends ILdapObject {
    objectClass: Array<ObjectClassEnum.top | ObjectClassEnum.posixGroup>;
}

export interface ILdapObjectGroupOfNames extends ILdapObject {
    objectClass: Array<ObjectClassEnum.top | ObjectClassEnum.groupOfNames>;
}

还有对象...

const test: ILdapObjectPosixGroup & ILdapObjectGroupOfNames  =  {
    objectClass: [ObjectClassEnum.top, ObjectClassEnum.groupOfNames, ObjectClassEnum.posixGroup],
}

想法是对象现在应该合并两个接口中的功能,但是会失败,因为两个接口中的对象类都不相同...

编辑:我认为实际上这是我在这里面临的问题... https://github.com/Microsoft/TypeScript/issues/16936

1 个答案:

答案 0 :(得分:0)

首先要注意的是,当您编写[SomeType]时,表示该类型的一个元素正好是一个元组,如果要使用数组,则应为SomeType[]

另一件事是,父接口应该比子接口更通用,而子接口在您的代码中是相反的。

根据您的要求,这样的方法应该起作用:

export enum ObjectClassEnum {
    top = 'top',
    posixGroup = 'posixGroup',
}

export interface ILdapObject {
    objectClass: ObjectClassEnum[]; 
}

export interface ILdapObjectTop extends ILdapObject {
    objectClass: ObjectClassEnum.top[]; 
}

export interface ILdapObjectPosixGroup extends ILdapObject {
    objectClass: (ObjectClassEnum.top | ObjectClassEnum.posixGroup)[]; 
}

const test: ILdapObjectPosixGroup = {
    objectClass: [ObjectClassEnum.top, ObjectClassEnum.posixGroup],
}

function processObject(obj: ILdapObject) {
    // ...
}

processObject(test)