Invalid type "any" of template literal expression.报错,ts中如何处理遍历obj访问下标类型报错;

217 阅读1分钟

1 问题

有如下一段代码:

const obj = {
    a: 1,
    b: 2
}

const objValueList = Object.keys(obj).map(it => {
   return obj[it]
})

看起来没什么问题,但是在ts环境下会报错:

image.png

这是因为这里的obj的key并没有声明对象,而Object.keys()访问对象返回的是string,两者不匹配,导致报错;

2 解决方案

2.1 解法1

避免使用类型推断,为obj声明一个interface类型,指定key为string

const obj: {
    [propsName: string]
} = {
    a: 1,
    b: 2
}

const objValueList = Object.keys(obj).map(it => {
   return obj[it]
})

2.2 as keyof

在遍历访问obj的同时,也遍历访问obj的类型:

interface IObj = {
    a: number,
    b: number
}
const obj: IObj = {
    a: 1,
    b: 2
}

type TObjKeys = keyof IObj;

const objValueList = (Object.keys(obj) as TObjKeys[]).map(it => {
   return obj[it]
})