TypeScript 单个对象类型中同时使用多个keyof约束的实现方案
解决方案
核心思路
TypeScript 不支持在单个对象类型内定义多个映射类型,因此使用交叉类型(&)合并多组约束,搭配泛型前置校验即可满足所有要求。
完整实现
// 工具类型:展开交叉类型,提升类型提示可读性,避免TS隐式合并类型导致的校验失效 type Prettify<T> = { [K in keyof T]: T[K] } & {} // 泛型前置约束:PS必须是P的子集,直接满足第三个约束 function createTest<P extends object, PS extends Partial<P>>( parseProps: Prettify< // 约束1:PS的所有键必须存在,且类型和PS定义匹配 Required<PS> // 约束2+额外键校验:P中不属于PS的键标记为never,不允许赋值;不在P范围内的键会触发TS多余属性校验直接报错 & Record<Exclude<keyof P, keyof PS>, never> > ) { // 函数实现逻辑 return { parseProps } } // 测试用例 const test = createTest<{type1: any, type2: any}, {type1: string}>({ type1: 'test', // 正常:PS要求的必填键 // type2: 123, // 报错:不能将类型number分配给类型never // type3: true // 报错:对象字面量只能指定已知属性,type3不存在于目标类型 })
语法报错原因说明
之前尝试在单个对象类型中写两个[key in ...]映射类型触发语法错误,是TypeScript的固定语法限制:单个对象类型定义中仅允许存在一个映射类型声明,使用交叉类型合并多个映射类型是该场景的标准解决方案。
内容的提问来源于stack exchange,提问作者Eliav Louski
相关产品推荐
相关产品推荐

