我正在寻找一种方法,当一种类型的键包含另一种类型的键时,可以替换该类型的键. 每个密钥将仅包含一个单一替换(在示例中,"abc"只在密钥中存在一次),该替换需要映射到其在替换类型中的等效值.
目前我正在做:
type Replacements = {
abc: 'cba';
bcd: 'dcb';
};
type Test = {
bcd: string;
aabca: string;
};
type ReplaceKeys<R extends Record<string, string>, T extends Record<string, unknown>> = {
[K in keyof T as K extends keyof R ? R[K] : K]: T[K];
};
type Replaced = ReplaceKeys<Replacements, Test>;
这给了我预期的这种类型:
type Replaced = {
dcb: string;
aabca: string;
}
不过,我想知道是否有一种方法可以替换包含的密钥.我try 创建一个类型来完成这项工作:
type ReplaceKeysInferred<
R extends Record<string, string>,
T extends Record<string, unknown>,
> = {
[K in keyof T as K extends `${infer A}${infer RKey extends keyof R & string}${infer B}`
? `${A}${R[RKey]}${B}`
: K]: T[K];
};
type ReplacedInferred = ReplaceKeysInferred<Replacements, Test>;
然而,返回的类型不包含任何替换:
type ReplacedInferred = {
bcd: string;
aabca: string;
}
不确定我哪里出了问题.
编辑: 我还try 过:
type ReplaceKeysInferred<
R extends Record<string, string>,
T extends Record<string, unknown>,
> = {
[K in keyof T as K extends `${infer A}${infer RKey}${infer B}`
? RKey extends keyof R
? `${A}${R[RKey]}${B}`
: K
: K]: T[K];
};
这本质上是对第一种类型的额外步骤.这与第一种回馈类型的运作方式相同:
type ReplacedInferred = {
bcd: string;
aabca: string;
}
它仍然没有替换任何包含的字符串.