You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:39:03