如何根据接口的键创建模板文字类型?
How to create a template literal type based on the keys of an interface?
我有这两个接口,代表我的应用程序中的一些数据结构。
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>}`;
不幸的是,这不起作用,因为接口可能具有用 symbol
索引的道具,而这些道具显然不能出现在模板字符串中。
还有其他方法可以实现吗?
您可以尝试从 keyof Lookup<k>
Exclude symbol
。适用于 4.3.5 Typescript 编译器
type TypePropString<K extends keyof TypeMap> = `${K}_${Exclude<keyof Lookup<K>, symbol>}`;
这使我能够枚举子类型
显然你不能在你的字符串类型中使用符号作为键,但我不确定这是否可以在 template literal types.
中完成
我有这两个接口,代表我的应用程序中的一些数据结构。
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>}`;
不幸的是,这不起作用,因为接口可能具有用 symbol
索引的道具,而这些道具显然不能出现在模板字符串中。
还有其他方法可以实现吗?
您可以尝试从 keyof Lookup<k>
Exclude symbol
。适用于 4.3.5 Typescript 编译器
type TypePropString<K extends keyof TypeMap> = `${K}_${Exclude<keyof Lookup<K>, symbol>}`;
这使我能够枚举子类型
显然你不能在你的字符串类型中使用符号作为键,但我不确定这是否可以在 template literal types.
中完成