typescript 如何使用字符串参数作为返回对象的模板文本键类型

ifmq2ha2  于 2022-12-05  发布在  TypeScript
关注(0)|答案(1)|浏览(144)

由于我无法找到一个有效的语法来解决我使用TypeScript的模板文字类型的问题,我将给予一个文本描述,说明我希望实现的目标:
给定一个函数fn,其输入为name: string,我希望将结果注解为类型为的对象

{[`use${Capitalize<name>}`]: any}

因此,对于任意name,它应该满足以下逻辑:

function createTypedObject(name) {
  return {[`use${name.charAt(0).toUpperCase() + name.substring(1)}`]: "any"}
}

我不确定这是否可以用于模板文字,因为在定义函数时插值变量是未知的。

i7uq4tfw

i7uq4tfw1#

您需要使用mapped type,例如{ [K inuse${Capitalize}]: any },相当于使用Record<K, V>公用程式类型的Record<use${Capitalize}, any>。例如:

function createTypedObject<T extends string>(
  name: T
): { [K in `use${Capitalize<T>}`]: any } {
  return {
    [`use${name.charAt(0).toUpperCase() + name.substring(1)}`]: "any"
  } as any; // compiler not smart enough to verify this
}

请注意,实现需要类型Assert,因为编译器无法验证返回的值是否符合返回类型。我假设这大多超出了问题的范围,所以我不会偏离主题讨论编译器无法看到这一点的各种方式。
不管怎样,让我们来测试一下:

const x = createTypedObject("hello");
// const x: { useHello: any; }

console.log(x.useHello) // "any"

看起来不错。编译器知道x具有所需的useHello属性。
Playground代码链接

相关问题