TypeScript是否有一种方法来要求属性a和属性B?



期望的行为如下:

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

提供propApropB或两者都不应该是可以的,但同时提供两者应该给出错误。我在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

操场上联系

最新更新