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
