Машинопись: только один из нескольких интерфейсов - PullRequest
0 голосов
/ 10 марта 2020

Можно ли объявить тип, который определяет, что допустим только один из нескольких интерфейсов?

Например:

interface Bar {
    properties: Record<string,any>
    construct?: () => void
    convert?: () => void
}

interface Foo {
    type?: string
    optional?: boolean
}

type FooBar = Bar | Foo;


//should not work
({
    properties: {},
    type: 'number'
} as FooBar);

//should not work
({
    convert: () => {},
    type: 'number'
} as FooBar);

//should work
({
    type: 'number',
    optional: true
} as FooBar);

//should work
({
    properties: {},
    convert: () => {}
} as FooBar);

Я хочу достичь, когда свойство: 'properties' определено, что могут быть добавлены только дополнительные свойства интерфейса 'Bar'. И когда свойство: 'properties' не определено, можно использовать только свойства интерфейса 'Foo'. Я попробовал это с Union, но тогда также возможно смешать интерфейсы.

Как я могу решить проблему и возможно ли это вообще?

1 Ответ

0 голосов
/ 10 марта 2020

Я считаю, что единственный способ сделать это - использовать Дискриминационные союзы . Вот так:

interface Foo {
    type: "foo";
    foo: number;
}

interface Bar {
    type: "bar";
    bar: string;
}

type FooBar = Foo | Bar;

let bar: FooBar = {
    type: "bar",
    foo: 42 // error
}

ссылка на игровую площадку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...