我想键入一个可以包含任何属性的对象,但如果它包含任何属性a
,b
或c
,则它必须包含所有属性专长a
,b
和c
。
换句话说:对象可以包含任何属性,但如果它包含a
,b
或c
,则它必须包含a
,b
< 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 | {};
答案 0 :(得分:4)
您可以在允许a
,b
和c
的类型与索引器之间创建联合类型,并强制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