Open yunliuyan opened 1 year ago
遍历node,若对应的key值属于改变值的联合类型里面,则在改变的对象寻找,找不到为never
type ReplaceKeys<T, U, I> = {
[key in keyof T]: key extends U ? key extends keyof I ? I[key] : never : T[key]
}
type ReplacedNodes = ReplaceKeys<
Nodes,
"name" | "flag",
{ name: number; flag: string }
> // {type: 'A', name: number, flag: string} | {type: 'B', id: number, flag: string} | {type: 'C', name: number, flag: string} // would replace name from string to number, replace flag from number to string.
type ReplacedNotExistKeys = ReplaceKeys<Nodes, "name", { aa: number }> // {type: 'A', name: never, flag: number} | NodeB | {type: 'C', name: never, flag: number} // would replace name to never
type ReplaceKeys<T, P, U> =
{
[k in keyof T]: k extends P ? k extends keyof U ? U[k] : never : T[k];
}
type ReplacedNodes = ReplaceKeys<
Nodes,
"name" | "flag",
{ name: number; flag: string }
> // {type: 'A', name: number, flag: string} | {type: 'B', id: number, flag: string} | {type: 'C', name: number, flag: string} // would replace name from string to number, replace flag from number to string.
type ReplacedNotExistKeys = ReplaceKeys<Nodes, "name", { aa: number }> // {type: 'A', name: never, flag: number} | NodeB | {type: 'C', name: never, flag: number} // would replace name to never
type ReplaceKeys<T, K extends keyof P, P> = {
[key in keyof T]: key extends K ? key extends keyof P ? P[key] : never : T[key];
};
这里貌似需要一个约束,如果第二个参数比第三个参数多一个,会导致前面的类型没有了
比如这种输入 type ReplacedNodes = ReplaceKeys< Nodes, "name" | "flag" | 'type', { name: number; flag: string }
// {type: 'A', name: number, flag: string} | {type: 'B', id: number, flag: string} | {type: 'C', name: number, flag: string} // would replace name from string to number, replace flag from number to string.
type ReplacedNotExistKeys = ReplaceKeys<Nodes, "name", { aa: number }> // {type: 'A', name: never, flag: number} | NodeB | {type: 'C', name: never, flag: number} // would replace name to never
ReplaceKeys
Implement a type ReplaceKeys, that replace keys in union types, if some type has not this key, just skip replacing, A type takes three arguments.
For example: