我有一个看起来像这样的类型:
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
,一种方法是将c
和d
属性分离到需要它们的不同对象中,并与该对象的交叉替换。
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, b
或a,b,c,d
属性。
连接到操场。