如何将字符串参数作为TypeScript返回对象的模板字面量键类型?
解决方案
你可以通过泛型结合模板字面量类型实现这个需求,核心是让TypeScript保留输入name的字面量类型信息,再通过Capitalize工具类型处理后生成属性键:
function createTypedObject<Name extends string>(name: Name): { [K in `use${Capitalize<Name>}`]: any; } { return { [`use${name.charAt(0).toUpperCase() + name.substring(1)}`]: "any" } as any; }
关键说明
- 泛型
Name extends string用来捕获输入name的具体字面量类型(比如传入"foo"时,Name就是"foo")。 - 模板字面量类型
`use${Capitalize<Name>}`会把Name的首字母大写后和use拼接,生成对应的属性键类型(比如Name是"foo"时,键类型就是"useFoo")。 - 返回值的
as any类型断言是因为TypeScript无法在编译时完全对齐动态生成的键和静态类型的对应关系,属于安全的兜底处理。
效果验证
当传入具体字符串字面量时,TypeScript会精准推断返回对象的类型:
const obj = createTypedObject("bar"); // obj的类型为 { useBar: any } obj.useBar; // 类型检查通过 obj.useFoo; // 类型报错,符合预期
如果传入的是普通string类型(非字面量),返回类型会是包含所有可能useXXX格式键的索引签名,逻辑自洽:
const dynamicName = "test"; const obj2 = createTypedObject(dynamicName); // obj2的类型为 { [x: `use${Capitalize<string>}`]: any }
内容的提问来源于stack exchange,提问作者Joscha Götzer
相关产品推荐
相关产品推荐

