Typescript ändra egenskapstyp rekursivt


Hur man ändrar egenskapstyp rekursivt, jag kan bara göra det i en dimension, att döma av utility-types verkar det möjligt att uppnå det, jag har försökt några gånger men kan inte få det rätt

type Convert<V, O extends object> = {
    [Key in keyof O] : V
}

// single
{
    let original = {
        data1 : 1,
        data2 : 1,

    };

    let converted : Convert<string, typeof original> = {
        data1: 'a',
        data2: 'a',
    };
}

// recursive
{
    let original = {
        data1 : 1,
        data2 : 1,
        data3 : {
            data1 : 1,
            data2 : 1,
        }
    };

    let converted : Convert<string, typeof original> = {
        data1: 'a',
        data2: 'a',
        data3 : {
            data1 : 'a',
            data2 : 'a',
        }
    };
}

Svar #1

Jag är ganska säker på att du vill ha en rekursiv villkorstyp där du bara går ner i egenskaper som själva är objekt:

type Convert<V, O extends object> = {
    [K in keyof O]: O[K] extends object ? Convert<V, O[K]> : V
}

Detta kommer att få din exempel kod att lyckas, men det kan finnas kantfall kring icke-primära egenskaper som du inte vill rekursivt gå igenom (t.ex. arrayer?), så du bör testa det noggrant.

Hoppas det hjälper; lycka till!

Lekplatslänk till kod

Relaterade artiklar