Typescript:如果一个类型也有属性b,确保它有属性a



我有一个看起来像这样的类型:

type MyType = {
a: string;
b: string;
c?: number;
d?: string;
}

有如下类型的对象:

const myObj1: MyType = { a, b };
const myObj2: MyType = { a, b, c, d };

如果一个MyType的对象具有c的属性,那么它一定具有d的属性。是否有一种方法来定义这种类型,这样我就不必非空断言或检查两种类型,而不是将类型扩展到不同的类型?

如果允许更改MyType,一种方法是将cd属性分离到需要它们的不同对象中,并与该对象的交叉替换。

type AB = {
a: string;
b: string;
};
type MyType = AB | AB & {
c: number;
d: string;
}

这样,如果MyType的某个元素被发现有c属性,TypeScript就会发现它也有d属性。

如果您希望属性'd'只在定义'c'时存在,反之亦然,则值得使用extended接口并将可选属性覆盖为never,如下所示:

type Base = {
a: string;
b: string;
c?: number;
d?: string;
} 
interface Concrete1 extends Base {
c?: never;
d?: never;
}

interface Concrete2 extends Base {
c: number;
d: string;
}
type MyType = Concrete1 | Concrete2;
const myObj1: MyType = { a: 'a', b: 'b' }; 👍
const myObj2: MyType = { a: 'a', b: 'b', c: 2 }; ❌
const myObj3: MyType = { a: 'a', b: 'b', c: 2, d: 'd' }; 👍

这将确保MyType的对象总是包含a, ba,b,c,d属性。

连接到操场。

相关内容

最新更新