前言

当我们使用Object.keys获取某个对象的key数组的时候,ts推导出来的类型是string[],当我们再通过forEach去遍历这个key数组时,由于string类型与对象具体的key不一致,导致报错:素隐式具有 "any" 类型,因为类型为 "string" 的表达式不能用于索引类型

我感觉ts这里的推导能力太差了,明明已经把具体的对象传递给他了,结果它直接返回一个string[]类型来一劳永逸,导致后续通过string类型去拿对象的value,就导致类型不匹配了。

解决办法

以前的我会这样写:

const kindMap = {
  balance: 1,
  gpu: 2
};

Object.keys(form.value).forEach((key) => {
  const k = key as keyof typeof kindMap;
  const value = kindMap[k];
})

使用一个变量来as指定类型,因为key在函数参数上并不方便as重新声明。

最近又想到了一个新办法,没必要声明一个新的变量了。

const kindMap = {
  balance: 1,
  gpu: 2
};

(Object.keys(form.value) as Array<keyof typeof kindMap>).forEach((key) => {
  const value = kindMap[key];
})

这样也可以,我们重新将Object.keys得到的数组重新as一下类型即可,这种方式相对来说更加优雅。

分类: TypeScript 标签: 类型TypeScriptObject.keys

评论

暂无评论数据

暂无评论数据

目录