为此构造一个类型是可能的,但直到 TS 4.1,它给了我们template literal types。
在 TS 4.1 中,您可以定义一个帮助器类型 Prefix,它可以发挥作用:
type Prefix<T extends { [K in keyof T]: string }, P extends string> = {
[K in keyof T & string as `${P}_${K}`]: `${P}_${T[K]}`
}
然后,直接定义一个Merge 函数,该函数使用此类型构造一个合并的枚举。
function merged<
T1 extends { [K in keyof T1]: string }, P1 extends string,
T2 extends { [K in keyof T2]: string }, P2 extends string,
>(obj1: T1, prefix1: P1, obj2: T2, prefix2: P2): Prefix<T1, P1> & Prefix<T2, P2> {
const result = {} as any; // Going to have to cast somewhere anyways...
for (const [k, v] of Object.entries(obj1)) {
result[`${prefix1}_${k}`] = `${prefix1}_${v}`;
}
for (const [k, v] of Object.entries(obj2)) {
result[`${prefix2}_${k}`] = `${prefix2}_${v}`;
}
return result;
}
const Merged = merged(A, 'A', B, 'B')
console.log(Merged) // { A_FOO: "A_BAR", A_GAR: "A_ZAR", B_FOO: "B_BAR" }
您可以在TypeScript playground 上试用此功能,或在您的项目中安装typescript@next。 TS 4.1 计划于 11 月 17 日发布。