如何从对象类型中推导出自包含指定属性结构且其余属性可选的类型?
如何从对象类型中推导出自包含指定属性结构且其余属性可选的类型?
你可以借助TypeScript的几个内置工具类型(Pick、Omit、Partial)组合实现这个需求,完全不用手动重新定义整个类型。咱们一步步来拆解:
首先明确目标:必须保留info.important这个嵌套结构作为必填项,其他所有属性(包括顶层的id,以及info里的notImportant)都设为可选。
直接看代码实现:
type MyType = { id: number; info: { notImportant: number; important: string; } } // 第一步:定义必填的核心结构——info必须存在,且info里的important必须存在 type RequiredCore = { info: Pick<MyType['info'], 'important'>; }; // 第二步:把剩下的所有属性(顶层的非info属性、info里的非important属性)都转为可选 type OptionalRest = Partial< Omit<MyType, 'info'> & { info: Omit<MyType['info'], 'important'>; } >; // 第三步:把必填核心和可选剩余部分交叉合并,得到最终类型 type DerivedType = RequiredCore & OptionalRest;
这样生成的DerivedType就完全符合你的要求:它必须包含info.important,而id、info.notImportant这些属性都变成了可选的。
咱们测试一下这个类型的合法性:
// ✅ 合法:只包含必填的info.important const valid: DerivedType = { info: { important: 'hello' } }; // ✅ 合法:额外添加了可选属性 const validWithExtras: DerivedType = { id: 100, info: { important: 'hello', notImportant: 200 } }; // ❌ 不合法:缺少必填的info.important const invalid: DerivedType = { info: { notImportant: 200 } };
如果觉得拆分步骤太繁琐,也可以把代码合并成一行,逻辑是一样的:
type DerivedType = { info: Pick<MyType['info'], 'important'> & Partial<Omit<MyType['info'], 'important'>>; } & Partial<Omit<MyType, 'info'>>;
简单说下背后的逻辑:
Pick<T, K>:从类型T中挑出指定的属性K,确保这些属性是必填的;Omit<T, K>:移除类型T中的属性K,剩下的属性用Partial<T>全部转为可选;- 交叉类型
&:把必填的核心结构和可选的剩余部分合并,就得到了“必须有指定结构,其余随便加不加”的类型。
备注:内容来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

