typescript - Recursive type substitution for ANY type - Stack Overflow

admin2025-05-01  0

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>;
    }
}
转载请注明原文地址:http://www.anycun.com/QandA/1746108633a91789.html