期望的行为如下:
const a: MyType = { foo: '' }; // should be OK
const b: MyType = { foo: '', propA: '' }; // should be OK
const c: MyType = { foo: '', propB: '' }; // should be OK
const d: MyType = { foo: '', propA: '', propB: '' }; // should be an error
提供propA
或propB
或两者都不应该是可以的,但同时提供两者应该给出错误。我在Stack Overflow上看到了许多类似的问题,但大多数都要求使用OR关系或异或关系,而不是NAND关系。
我如何定义MyType
来实现这个期望的行为?
这有点笨拙,但应该可以工作:
interface FooType {
foo: string;
}
interface FooPropAType extends FooType {
propA:string;
}
interface FooPropBType extends FooType {
propB: string;
}
type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };
type XOR<T, U> = (T | U) extends object ? (Without<T, U> & U) | (Without<U, T> & T) : T | U;
type MyType = XOR<FooType, XOR<FooPropAType, FooPropBType>>;
const a: MyType = { foo: '' }; // should be OK
const b: MyType = { foo: '', propA: '' }; // should be OK
const c: MyType = { foo: '', propB: '' }; // should be OK
const d: MyType = { foo: '', propA: '', propB: '' }; // should be an error
操场上联系