Построение комбинированного интерфейса - PullRequest
0 голосов
/ 03 января 2019

Я ищу способ построения структуры интерфейса массива в стиле LDAP (objectclass). Я пробовал несколько способов с различными вариантами интерфейсов, но грубая базовая идея - что-то вроде этого ...

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 голосов
/ 03 января 2019

Первое, что нужно отметить, это то, что когда вы пишете [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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...