TypeScript泛型实现数组内每个对象独立校验属性类型一致
TypeScript 数组元素独立类型约束实现方案
要实现数组中每个对象独立遵循p1、p2同类型的约束,核心是触发TypeScript的元组逐位类型推导,让每个数组元素单独匹配泛型约束,而非为整个数组统一推导泛型参数。
最终实现代码
保留原有的单对象类型定义,仅需调整函数泛型和参数类型即可,兼容任意长度数组、任意自定义类型:
// 原有单对象约束,无需修改 type O<T> = { p1: T; p2: T; }; const f = <T extends readonly O<any>[]>(a: { [K in keyof T]: O<T[K]["p1"]> }) => { console.log(a); };
效果说明
- 合法输入不会误报:不同数组元素可以使用完全独立的类型,TS会逐位校验每个元素内部
p1和p2类型一致// 所有场景均校验通过,无报错 f([ { p1: 1, p2: 2 }, // number类型 { p1: '3', p2: '4' }, // string类型 { p1: true, p2: false }, // boolean类型 { p1: { name: 'test' }, p2: { name: 'demo' } } // 自定义对象类型 ]); - 非法输入精准报错:只要某个元素内部
p1和p2类型不一致,会在对应位置抛出类型错误f([ { p1: 1, p2: 2 }, { p1: 3, p2: '4' } // 抛出类型错误:类型'string'不能赋值给类型'number' ]);
原有方案问题原因
O<T>[]写法:泛型T是整个数组共享的参数,TS会将所有元素的类型合并推导T,要么以首个元素类型为准,要么推导为所有元素类型的联合类型,无法做到元素间约束独立- 普通映射类型写法:没有强制绑定单个元素内部
p2和自身p1的类型关系,TS会将单个元素内的p1、p2也合并为联合类型,导致类型校验漏过错误
内容的提问来源于stack exchange,提问作者daniel grieb
相关产品推荐
相关产品推荐

