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

TypeScript泛型报错T[string]不可分配给number类型问题问询

疑问1解答

你当前定义的泛型T没有任何类型约束,也就是说T可以是任意结构的对象,其属性值可以是字符串、布尔值、对象等任意类型,TS无法保证你传入的sortKey对应的属性值一定是数字类型。报错是TS的类型安全机制生效:它不允许你把一个类型不确定的值直接赋值给明确声明为number的变量,避免运行时出现数值计算错误。

疑问2解答

可以通过类型约束实现你的需求,只需要先提取对象中所有值为数字类型的属性键,再对泛型和sortKey参数做对应约束即可,优化后的代码如下:

// 工具类型:提取泛型T中所有值为number类型的属性名
type NumberPropertyKeys<T> = {
  [K in keyof T]: T[K] extends number ? K : never
}[keyof T]

export function resample<T, K extends NumberPropertyKeys<T>>(
    originalArray: Array<T>,
    sortKey: K,
    samplingInterval: number
): Array<T> {
  const array = [...originalArray];
  const queuedItem = array.shift();
  // 增加空数组边界处理,避免运行时报错
  if (!queuedItem) return [];
  // 此时TS可自动推导queuedItem[sortKey]为number类型,无需额外类型断言
  const t0 = queuedItem[sortKey];

  // ... 其余代码
  return [queuedItem]
}

效果验证

调用函数时,如果传入的sortKey对应属性不是数字类型,TS会直接抛出类型错误,完全符合你的要求:

const testArr = [
  { timestamp: 1001, content: "测试1" },
  { timestamp: 1002, content: "测试2" }
]
// 合法调用
resample(testArr, "timestamp", 2)
// 非法调用,TS报错:类型“"content"”的参数不能赋给类型“"timestamp"”的参数
resample(testArr, "content", 2)

内容的提问来源于stack exchange,提问作者Seth Lutske

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:09:02