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

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

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

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

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

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

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

i7uq4tfw

i7uq4tfw1#

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

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

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

  1. const x = createTypedObject("hello");
  2. // const x: { useHello: any; }
  3. console.log(x.useHello) // "any"

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

展开查看全部

相关问题