【问题标题】:Typing reduce function which takes generics (noImplicityAny)键入使用泛型的 reduce 函数 (noImplicitAny)
【发布时间】:2019-08-02 23:39:23
【问题描述】:

我有一个函数,它接受一个对象并将其键转换为蛇形字符串并返回它。我正在使用reduce 构造新对象,但似乎无法解决此错误:

元素隐式具有“any”类型,因为类型“{}”没有索引 signature.ts(7017)

这发生在return { ...o, [snakeCase(k)]: evt[k] }; 行上,表明evt[k] 具有any 类型。我该如何解决这个问题?是否因为这是一个空对象而丢弃了索引签名,即使它具有具有索引签名的类型?

interface StringKeyMap<T> {
  readonly [key: string]: T[keyof T];
}

function snakeCaseKeys<T extends object>(evt: T): StringKeyMap<T> {
  const initial: StringKeyMap<T> = {};

  return Object.keys(evt).reduce<StringKeyMap<T>>((o, k) => {
    return { ...o, [snakeCase(k)]: evt[k] };
  }, initial);
}

【问题讨论】:

标签: typescript generics reduce


【解决方案1】:

问题是Object.keys(evt) 的返回类型是string[] 而不是Array&lt;keyof T&gt;。这是intentional,尽管peoplelotreported 这是issue。无论如何,由于k 只是一个string,那么evt[k] 被认为是不安全的,尽管k 来自Object.keys()

解决此问题的最简单方法是通过某个地方的type assertion,以便k 被视为keyof T。例如:

  return Object.keys(evt).reduce<StringKeyMap<T>>((o, k) => {
    const z =  { ...o, [snakeCase(k)]: evt[k as keyof T] };
    return z;
  }, initial); // no error

希望对您有所帮助。祝你好运!

【讨论】:

  • 这就是为什么我仍然认为务实的做法是将keys 输入为Array&lt;keyof T&gt;... 10 次中有 9 次(没有实际指标,只是直觉)无论如何,您最终都会对keyof T 进行断言。哦,好吧:(
猜你喜欢
  • 2021-06-15
  • 2020-11-27
  • 1970-01-01
  • 2020-01-24
  • 2019-07-19
  • 2021-11-17
  • 1970-01-01
  • 2020-02-27
  • 2022-01-25
相关资源
最近更新 更多