接口中的条件必需属性

时间:2018-03-13 20:13:58

标签: typescript

我想键入一个可以包含任何属性的对象,但如果它包含任何属性abc,则它必须包含所有属性专长abc

换句话说:对象可以包含任何属性,但如果它包含abc,则它必须包含ab < strong>和 c

let something: Something;

// these should be valid:
something = { a: 1, b: 1, c:, 1 };
something = { a: 1, b: 1, c:, 1, custom: 'custom' };
something = { custom: 'custom' };

// these should be invalid:
something = { a: 1 };
something = { a: 1, b: 1 };
something = { a: 1, c: 1 };
something = { b: 1 };
something = { a: 1, custom: 'custom' };

如何实现这一目标?

使用对象创建联合类型似乎是正确的,但不起作用:

interface RequiredProps {
    a: number;
    b: number;
    c: number;
}

type Something = RequiredProps | {};

1 个答案:

答案 0 :(得分:4)

您可以在允许abc的类型与索引器之间创建联合类型,并强制a,{{1如果存在,则b类型为c

never

如果您有返回 type Something = ({ a: number, b: number, c: number } & { [n: string]: any }) | ( { a?: never, b?: never, c?: never } &{ [n: string]: any }); 的函数,则可以分配属性,但对于大多数实际的属性,这应该有效。

我们甚至可以为这种情况创建一个通用类型:

never