I am aware of this question, however, it does not solve my problem, because I need to recursively replace types in functions, arrays, and tuple types while preserving the function-, array-, or tuple-ness of the type.
Is such a type substitution possible? If so, how?
Test case:
type Foo = {
bar(x: number, y: string): string
baz: {
a(): string
b: [string, string]
c: string[]
},
bing: Promise<string>
boom: Set<string>
bah: {
a: Map<number, string>
b: Map<string, string>
c: Map<string, number>
}
};
type Bar = ReplaceTypes<Foo, string, "inky" | "pinky" | "blinky" | "clyde">;
var x: Bar;
Expected output:
var x: {
bar: (x: number, y: "inky" | "pinky" | "blinky" | "clyde") => "inky" | "pinky" | "blinky" | "clyde";
baz: {
a: () => "inky" | "pinky" | "blinky" | "clyde";
b: ["inky" | "pinky" | "blinky" | "clyde", "inky" | "pinky" | "blinky" | "clyde"];
c: ("inky" | "pinky" | "blinky" | "clyde")[];
};
bing: Promise<"inky" | "pinky" | "blinky" | "clyde">;
boom: Set<"inky" | "pinky" | "blinky" | "clyde">;
bah: {
a: Map<number, "inky" | "pinky" | "blinky" | "clyde">;
b: Map<"inky" | "pinky" | "blinky" | "clyde", "inky" | "pinky" | "blinky" | "clyde">;
c: Map<"inky" | "pinky" | "blinky" | "clyde", number>;
}
}