Интерфейсы машинописи: Как к чему-либо кроме известного ключа должно быть <T>? - PullRequest
0 голосов
/ 04 мая 2020

Мне бы хотелось иметь интерфейс, в котором все, кроме известных реквизитов, должно быть определенного типа c.

Пример:

interface ITest {
    prop1: string;
    prop2?: number;
    [key: string]: IAnotherInterface | AnotherType // Everthing else that is not "prop1" or "prop2"
}

Как этого добиться? ?

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Я хотел бы go сделать это, создав базовый интерфейс и расширив его, а затем использовать тип Omit .

Пример:

interface BaseInterface {
  [key: string]: SomeType
}

type OmittedKeys = "key1" | "key2"

interface Extended extends Omit<BaseInterface, OmittedKeys> {
  key1: string,
  key2: number
}
0 голосов
/ 06 мая 2020

Кажется, это возможно только с Отрицательными типами , который на момент написания этой статьи все еще оставался открытым. Единственный разумный способ приблизиться к этому на данный момент - это использовать тип объединения вместе с другим интерфейсом:

interface IBase {
    "!prop1": string;
}

interface ITest extends IBase {
    [key: string]: string | typeA | InterfaceB // etc... 
}

И чем позже в ссылке на код, тем более строгим типом по мере необходимости:

function fn(arg: ITest): IBase | ITest {
    if (arg["!prop1"]) {
        return arg as IBase
    } else {
        return arg as ITest
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...