【发布时间】:2021-11-12 12:35:52
【问题描述】:
给定一个简单的界面:
interface Schedule {
interval: "month" | "day";
price: number;
}
我可以构造一个模板文字类型(使用ts4.4):
type PrefixedScheduleKey = `schedule__${keyof Schedule}`; // "schedule__interval" | "schedule__price"
假设有一些这样的接口,我想合并(基本上展平)它们的前缀、模板文字键以结束:
interface Metadata {
foo: string;
bar: string;
// computed
schedule__interval: "month" | "day";
schedule__price: number;
...
}
我应该如何声明这样的接口键?
interface Metadata {
[key: PrefixedScheduleKey]: any
}
// throws
// An index signature parameter type cannot be a literal type or generic type. Consider using a mapped object type instead.(1337)
和
interface Metadata {
[key in `schedule__${keyof Schedule}`]: any
}
// leads to
// A computed property name must be of type 'string', 'number', 'symbol', or 'any'.(2464)
// Member '[key in `schedule__${keyof' implicitly has an 'any' type.(7008)
这是playground。
顺便说一句,使用type 而不是interface 是suggested on github,但这不起作用,因为我的Metadata 接口已经扩展了另一个接口,但我试图保持示例简单。
【问题讨论】:
-
interface Metadata extends AnotherInterface, Record<PrefixedScheduleKey, any> {}怎么样? -
这行得通,谢谢@Jean-Alphonse!随意将其转换为答案。
标签: typescript template-literals