TypeScript中如何实现对象两个可选属性的联动必填?
实现TypeScript中属性的联动必填/可选
要实现「age和isHiringPossible要么同时存在,要么同时不存在」的约束,不能用单一接口定义,得通过联合类型组合两种合法的结构:
方案代码
type MakeMandatory = // 情况1:仅包含必填的name,age和isHiringPossible都不存在 { name: string } // 情况2:同时包含name、age和isHiringPossible,后两者为必填 | { name: string; age: number; isHiringPossible: boolean };
验证示例
- 合法用法:
// 仅提供name const valid1: MakeMandatory = { name: "Alice" }; // 同时提供三个属性 const valid2: MakeMandatory = { name: "Bob", age: 30, isHiringPossible: true };
- 非法用法(TypeScript会直接报错):
// 仅提供name和age,缺少isHiringPossible const invalid1: MakeMandatory = { name: "Charlie", age: 25 }; // 仅提供name和isHiringPossible,缺少age const invalid2: MakeMandatory = { name: "Dave", isHiringPossible: false };
拆分接口的写法(可读性更强)
如果需要复用基础结构,可以拆分为多个接口再组合:
interface BaseProfile { name: string; } interface CompleteHiringProfile extends BaseProfile { age: number; isHiringPossible: boolean; } type MakeMandatory = BaseProfile | CompleteHiringProfile;
这种写法和上面的联合类型效果完全一致,只是拆分后更便于维护和扩展。
内容的提问来源于stack exchange,提问作者Kugesh Rajasekaran
相关产品推荐
相关产品推荐

