由于我无法找到一个有效的语法来解决我使用TypeScript的模板文字类型的问题,我将给予一个文本描述,说明我希望实现的目标:
给定一个函数fn
,其输入为name: string
,我希望将结果注解为类型为的对象
{[`use${Capitalize<name>}`]: any}
因此,对于任意name
,它应该满足以下逻辑:
function createTypedObject(name) {
return {[`use${name.charAt(0).toUpperCase() + name.substring(1)}`]: "any"}
}
我不确定这是否可以用于模板文字,因为在定义函数时插值变量是未知的。
1条答案
按热度按时间i7uq4tfw1#
您需要使用mapped type,例如
{ [K in
use${Capitalize}]: any }
,相当于使用Record<K, V>
公用程式类型的Record<
use${Capitalize}, any>
。例如:请注意,实现需要类型Assert,因为编译器无法验证返回的值是否符合返回类型。我假设这大多超出了问题的范围,所以我不会偏离主题讨论编译器无法看到这一点的各种方式。
不管怎样,让我们来测试一下:
看起来不错。编译器知道
x
具有所需的useHello
属性。Playground代码链接