类型“string”不能用于索引类型“T”.ts(2536)

Gar*_*ett 7 typescript

result[key]我收到上述错误

type DataType = Record<string, number>
export function getDifference<T extends DataType>(data1: T, data2: T): T {
  const keys = Object.keys(data1)
  return keys.reduce<T>((result, key) => {
    result[key] = data1[key] - data2[key]
    return result
  }, {})
}
Run Code Online (Sandbox Code Playgroud)

如何在仍然返回泛型类型的同时摆脱它T,以便使用函数仍然收到正确的类型(而不是简单地更改TDataType)。

Eli*_*ski 8

keys您需要手动设置和 的result[key]正确类型,{}因为 typescript 无法自动正确识别它们。

type DataType = Record<string, number>
export function getDifference<T extends DataType>(data1: T, data2: T): T {
  const keys: (keyof T)[] = Object.keys(data1)
  return keys.reduce<T>((result, key) => {
    if(typeof data1[key] === "number" && typeof data2[key]) { // Safeguard against object, array, etc. properties
        result[key] = data1[key] - data2[key] as T[keyof T]
    }
    return result
  }, {} as T)
}
``
Run Code Online (Sandbox Code Playgroud)

  • 根据“Record&lt;string, number&gt;”,每个属性应该是“number” (2认同)