【问题标题】:Using keyof in Typescript to get rid of 'element implicitly has any type' error在 Typescript 中使用 keyof 来消除“元素隐式具有任何类型”错误
【发布时间】:2021-07-14 01:52:32
【问题描述】:

我知道这还有其他问题,但似乎都没有帮助我了解我需要做些什么来解决这个问题。

我已将一个属性设置为组件状态的一部分,并且该对象应该是我用作“映射”来存储键值对的对象.

SampleAttribute: {
  x: '',
  y: []
}

它的值是在我的组件的一个函数中设置的,我使用 this.setState 将属性设置为我初始化的对象,如下所示:

    let kvPairs: { [key: string]: any[] } = {};

但是,在我的函数调用 this.setState 之前的某个时刻,它会将 this.state.SampleAttribute 存储在变量 sampleAttribute 中。此时,我想检查一个字符串数组listOfThings是否有它的任何元素作为sampleAttribute的键,所以我在调用

listOfThings.map(thing => {
  if (sampleAttribute[thing])
    // do stuff
})

我在 if 语句的那一行得到了错误:

TypeScript: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type

我知道许多答案需要使用 keyof 让编译器知道它可以接受什么作为字符串来索引对象,但似乎这样做需要我创建一个新类型,因为 keyof 需要传递给它的类型。 .所以我只是不知道如何在不走那条路线的情况下做到这一点。

【问题讨论】:

    标签: reactjs typescript


    【解决方案1】:

    你可以像这样创建一个类型安全的访问器:

    const doOnIndex = <T>(obj: T, thing: string, fn: (ele: typeof obj[keyof typeof obj]) => void): void => {
      if (thing in obj) {
        fn(obj[thing]);
      }
    };
    
    // Used like
    doOnIndex(SampleAttribute, thing, ele => ele);
    

    在这种情况下,您是在告诉编译器,因为您成功索引了对象,结果类型必须是已知对象的值类型的并集。

    我不确定为什么 kvPairs 是相关的,如果有一个完整的代码示例会更容易很多

    【讨论】:

    • 我知道有人说要发布完整的代码,但这是我工作中的一门课,超过 300 行。我永远不会发布所有内容,我不知道如何判断哪些内容有用或不排除
    • 为什么感觉应该是简单的事情的答案看起来如此复杂?就像我编写的代码与应如何使用 react 如此相反,以至于我在 SO 中找不到一个相似且可以正常工作的示例?
    • 您遇到的错误只是因为您启用了 TS 的 noImplicitAny 选项而被引发。事实上,你可以简单地忽略它(使用// @ts-ignore),你的程序就可以正常工作了。如果你真的不能有隐式anys 并且你必须动态索引一个对象,你将不得不告诉 TS 如何处理它。
    猜你喜欢
    • 2021-11-11
    • 2021-05-28
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2021-08-26
    • 2021-10-27
    相关资源
    最近更新 更多