TypeScript能否自动推断数字索引对象的值类型?
问题:让对象转Map的函数自动推断值类型
我编写了一个辅助函数,用于将带数字键的对象转换为Map:
interface IndexedObject { [index: number]: unknown; }; const objectToIndexedMap = (indexedObject: IndexedObject) => new Map( Object.entries(indexedObject).map( ([ index, field ]) => [ Number(index), field ] ) );
用它转换从API获取的对象时,可以避免处理字符串键,但函数返回类型是Map<number, any>,我希望能复用输入对象中值的类型,让函数返回值类型自动匹配输入对象的值类型。
比如以下场景中,希望TypeScript能触发错误:
interface IndexedNumbers { [index: number]: number; } const indexedNumbers: IndexedNumbers = api.numbers; // 伪代码 const map = objectToIndexedMap(indexedNumbers); const foo = map.get(0)!.toUpperCase(); // 此处应触发错误,因为number类型没有toUpperCase方法
我知道可以手动指定返回类型:
const map: Map<number, number> = objectToIndexedMap(indexedNumbers);
但想让TypeScript自动完成类型推断,是否可行?
解决方案
可以通过泛型实现自动类型推断,修改函数定义,让它自动捕获输入对象的值类型,具体修改如下:
const objectToIndexedMap = <T>(indexedObject: { [index: number]: T }) => new Map( Object.entries(indexedObject).map( ([index, field]) => [Number(index), field] as [number, T] ) );
关键修改点:
- 新增泛型
<T>,用于自动捕获输入对象的值类型; - 将入参类型改为
{ [index: number]: T },替代固定的IndexedObject,让TypeScript能关联输入值的类型; - 给
map回调的返回值添加as [number, T]类型断言,修正Object.entries键为字符串导致的类型偏差,明确Map的键值类型。
验证效果
用修改后的函数运行示例代码:
interface IndexedNumbers { [index: number]: number; } const indexedNumbers: IndexedNumbers = { 0: 123, 1: 456 }; const map = objectToIndexedMap(indexedNumbers); const foo = map.get(0)!.toUpperCase(); // TypeScript会报错:属性'toUpperCase'在类型'number'上不存在
此时TypeScript会正确触发错误,符合预期,而且不需要手动指定map的类型,完全由自动推断完成。
内容的提问来源于stack exchange,提问作者Robo Robok
相关产品推荐
相关产品推荐

