我正在寻找构建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
答案 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)