如何在Record类型中传入正确键类型?构造联合类型键的对象类型
解决TypeScript中用Record构造指定字段联合类型键的对象类型问题
你遇到的问题核心是对Pick和类型索引访问的作用理解有误:
Pick<Test, 'c'>返回的是包含c字段的对象类型(即{ c: 'x' | 'y' | 'z' }),但Record的第一个参数要求是可作为对象键的类型(比如字符串字面量联合、number、symbol等),对象类型没法直接当键用,所以会报错。
正确的做法是用类型索引访问直接获取Test接口中c字段的类型:
interface Test { a: string; b: string; c: 'x' | 'y' | 'z'; } // 正确构造目标对象类型 type CKeyRecord = Record<Test['c'], string>;
此时CKeyRecord会被TypeScript解析为:
{ x: string; y: string; z: string; }
完全符合你想要的、包含c字段联合类型所有键的对象类型。
如果后续需要提取多个字段的类型作为联合键,也可以用类似的方式,比如Record<Test['a' | 'c'], string>(不过这里a的类型是string,作为键的话会是宽泛的字符串类型,需要注意场景)。
内容的提问来源于stack exchange,提问作者Amjad sibili
相关产品推荐
相关产品推荐

