TypeScript中泛型的深层条件类型

TypeScript中泛型的深层条件类型,typescript,types,type-level-computation,higher-kinded-types,recursive-type,Typescript,Types,Type Level Computation,Higher Kinded Types,Recursive Type,因此,我有一个助手函数,它允许我根据结构匹配替换类型: type Replace<T, C, A> = { [P in keyof T]: T[P] extends C ? A : T[P] } 我还没来得及擦干眼泪,就有人扔给我一个: type TupleStringNumberThing = { value: [string, number] } 。。。除非你们帮我,否则我会蜷缩成胎儿的姿势:鉴于你们的具体例子,我会这样写: type DeepReplace<T

因此,我有一个助手函数,它允许我根据结构匹配替换类型:

type Replace<T, C, A> = {
    [P in keyof T]: T[P] extends C ? A : T[P]
}
我还没来得及擦干眼泪,就有人扔给我一个:

type TupleStringNumberThing = { value: [string, number] }

。。。除非你们帮我,否则我会蜷缩成胎儿的姿势:

鉴于你们的具体例子,我会这样写:

type DeepReplace<T, C, A> = T extends C ? A : T extends object ? {
    [P in keyof T]: DeepReplace<T[P], C, A> } : T;
这适用于您的所有类型:

显然你可以找到其他的边缘案例。。。接受/返回C的函数应该与接受/返回A的函数相同吗?这些可能是可以处理的,但是如果您的用例不需要它,那么它可能不值得额外的复杂性

好吧,希望这会有帮助;祝你好运


鉴于您的具体示例,我会这样写:

type DeepReplace<T, C, A> = T extends C ? A : T extends object ? {
    [P in keyof T]: DeepReplace<T[P], C, A> } : T;
这适用于您的所有类型:

显然你可以找到其他的边缘案例。。。接受/返回C的函数应该与接受/返回A的函数相同吗?这些可能是可以处理的,但是如果您的用例不需要它,那么它可能不值得额外的复杂性

好吧,希望这会有帮助;祝你好运


为什么不这样写:键入ArrayOfStringThing=Replace?因为那太容易了;关键是要找到一个任意深度类型替换问题的答案。为什么不这样写:类型ArrayOfStringThing=Replace?因为那太容易了;关键是要找到一个任意深度类型替换问题的答案。
type ArrayOfNumberThing = { value: Array<number>, simpleValue: number }
type ArrayOfStringThing = Replace<ArrayOfNumberThing, number, string>
const b: ArrayOfStringThing = { value: ["cenas"], simpleValue: "still works" }
type CrazyNumberThing = { value: Array<Array<Array<number>>> }
type RecursiveArrayReplace<T, C, A> = T extends C ? A : (T extends Array<infer E> ? RecursiveArrayReplace<E, C, A> : T)
Type alias 'RecursiveArrayReplace' circularly references itself.
type TupleStringNumberThing = { value: [string, number] }
type DeepReplace<T, C, A> = T extends C ? A : T extends object ? {
    [P in keyof T]: DeepReplace<T[P], C, A> } : T;
type NumberThing = { value: number }
type StringThing = DeepReplace<NumberThing, number, string>
// type StringThing = { value: string; }

type ArrayOfNumberThing = { value: Array<number>, simpleValue: number }
type ArrayOfStringThing = DeepReplace<ArrayOfNumberThing, number, string>;
// type ArrayOfStringThing = { value: string[]; simpleValue: string; }

type CrazyNumberThing = { value: Array<Array<Array<number>>> };
type CrazyStringThing = DeepReplace<CrazyNumberThing, number, string>;
// type CrazyStringThing = { value: string[][][]; }

type TupleStringNumberThing = { value: [string, number] };
type TupleStringStringThing = DeepReplace<TupleStringNumberThing, number, string>;
// type TupleStringStringThing = { value: [string, string]; }