TypeScript:使用指定键创建对象时类型推导为any的问题
解决TypeScript中Object.fromEntries的类型推导问题
修正后的代码
const createObj = <T extends string>(keys: readonly T[]): Record<T, 0> => { return Object.fromEntries( keys.map((key) => [key, 0] as const) ) as Record<T, 0>; }; const result = createObj(["hi","hello","gg"] as const); // result类型为 { hi: 0; hello: 0; gg: 0; }
关键调整说明
- 适配只读字面量数组:把参数类型从
T[]改为readonly T[],这样能兼容as const生成的只读字符串字面量数组,让TypeScript正确推导T为"hi" | "hello" | "gg"这个具体的联合类型。 - 明确返回类型:用
Record<T, 0>指定函数返回类型,直接声明返回对象的键是T类型、值是字面量0类型,替代默认的any。 - 细化数组项类型:给
[key, 0]加上as const,确保数组值的类型被推导为字面量0而非宽泛的number,最终让返回值的类型完全符合预期。
如果不需要值严格为0,只要求是number类型,可以把返回类型改成Record<T, number>,同时去掉[key, 0]后的as const。
内容的提问来源于stack exchange,提问作者MINJA KIM
相关产品推荐
相关产品推荐

