【问题标题】:How to create a template literal type based on the keys of an interface?如何根据接口的键创建模板文字类型?
【发布时间】:2021-10-17 08:06:44
【问题描述】:

我有这两个接口代表我的应用程序中的一些数据结构。

interface Foo {
  a: number,
  b: number,
  c: number,
}

interface Bar {
  g: number,
  h: number,
  j: number,
}

为了能够通过它们的字符串名称识别这些接口(即从文件中解析或获取用户输入时),我有以下查找接口:

interface TypeMap {
  foo: Foo,
  bar: Bar,
}

这允许我创建实用程序类型,例如:

type Lookup<K extends keyof TypeMap> = TypeMap[K];
type FooType = Lookup<'foo'>; // Foo
type FooPropNames = keyof Lookup<'foo'>; // 'a' | 'b' | 'c'

问题从这里开始。 我想为类似 "foo_a" "bar_j" 之类的字符串创建一个类型 - 由其中一种类型的小写名称及其道具名称之一组成。

type TypePropString<K extends keyof TypeMap> = `${K}_${keyof Lookup<K>}`;

不幸的是,这不起作用,因为接口可能有用symbols 索引的道具,而这些道具显然不能出现在模板字符串中。

还有其他方法可以实现吗?

【问题讨论】:

    标签: typescript typescript-typings typescript-generics


    【解决方案1】:

    你可以尝试从keyof Lookup&lt;k&gt;Excludesymbol。适合我使用 4.3.5 Typescript 编译器

    type TypePropString<K extends keyof TypeMap> = `${K}_${Exclude<keyof Lookup<K>, symbol>}`;
    

    这使我能够枚举子类型

    显然,您将无法在字符串类型中使用符号作为键,但我不确定这是否可以在 template literal types 内部完成。

    【讨论】:

    • @szydlovski 很高兴我能提供帮助,我不确定我的解决方案是否适合您的问题。在 TS 中练习“Utility Types”是一段漫长的旅程)
    猜你喜欢
    • 1970-01-01
    • 2022-10-24
    • 2020-05-16
    • 2021-11-06
    • 2022-10-24
    • 2021-06-28
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多