You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 13:03:29