lodash _.keyBy()会将数字转为字符串,如何通过NumericDictionary避免该转换?
问题解答
核心原因
JavaScript 原生普通对象的键只支持字符串和 Symbol 两种类型,所有传入的非字符串类型的键都会被自动调用toString()转成字符串,这是 JS 语言层面的规则,和 lodash 的实现无关。
关于 NumericDictionary<T> 接口
这个是 TypeScript 为 lodash 提供的类型定义工具,作用是仅在类型校验层面允许你用数字作为索引访问_.keyBy返回的对象,不会报类型错误,完全不影响运行时的实际逻辑,没办法解决运行时键被转成字符串的问题。
使用示例:
import { keyBy, type NumericDictionary } from 'lodash'; const list = [{ id: 1, name: 'a' }, { id: 2, name: 'b' }]; // 标注返回值类型为 NumericDictionary,就可以用数字索引访问,TS 不会报错 const keyed: NumericDictionary<typeof list[number]> = keyBy(list, 'id'); console.log(keyed[1]); // TS 类型校验通过,运行时实际等价于 keyed['1']
运行时保留数字键的方案
如果需要运行时真的保留数字类型的键,替换普通对象使用 Map 即可,你可以基于 lodash 的 reduce 快速实现:
import { reduce } from 'lodash'; const list = [{ id: 1, name: 'a' }, { id: 2, name: 'b' }]; const keyedMap = reduce(list, (map, item) => { map.set(item.id, item); return map; }, new Map<number, typeof list[number]>()); console.log(keyedMap.get(1)); // 运行时键确实是数字类型,不需要转字符串
内容的提问来源于stack exchange,提问作者sf8193
相关产品推荐
相关产品推荐

