如何在打字稿中的for-in循环中强制转换索引变量?

时间:2019-02-15 10:24:03

标签: typescript loops casting

我有一个这样的对象:

const lettersAtIndex: {[index: string]: string[]} = {4: ['a', 'b'], 6: ['c', 'f']}

我想遍历它:

Object.keys(lettersAtIndex).forEach(index => {
    doSomething(lettersAtIndex[index]) // index expression is not of type number
    doSomething2(lettersAtIndex[index]) // index expression is not of type number
    doSomething3(lettersAtIndex[index]) // index expression is not of type number
})

index强制转换为数字的建议方式是什么。我应该只创建另一个变量吗?

Object.keys(lettersAtIndex).forEach(index => {
    const numericIndex = Number(index)
    doSomething(lettersAtIndex[numericIndex])        
    doSomething2(lettersAtIndex[numericIndex])
    doSomething3(lettersAtIndex[numericIndex])
})

2 个答案:

答案 0 :(得分:1)

似乎Object.keys没有模板签名(Object.keys<T>)。但是,您可以将string[]返回的Object.keys映射到Number构造函数,然后将其传递给forEach。类似于您的建议。

Object.keys(obj)
    .map(Number)
    .forEach(index => {
        // index is a number here
    });

答案 1 :(得分:1)

Object.keys总是返回一个字符串,因此,上面的方法很好。

但是对于您而言,我认为index与这些功能无关,所以为什么不使用

Object.values(lettersAtIndex).forEach(val => {
    doSomething(val)        
    //...
})

如果您需要索引为数字,并且不想对其进行转换,则可以考虑同时使用Map

const lettersAtIndex = new Map<number, string[]>([[4, ['a', 'b']], [6, ['c', 'f']]]);

Array.from(lettersAtIndex.keys()).forEach((index) => {
    doSomething(lettersAtIndex[index]);
});