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
相关产品推荐
相关产品推荐

