vue.js - Ist es möglich, verschachtelte Generika ohne explizite Definition in TypeScript zu erstellen
Ich habe Schwierigkeiten, einen Typ zu schreiben, der einen Typ auf alle untersten Eigenschaften eines anderen Typs anwendet.
Der Zweck davon ist, einen Typ zu erstellen, der alle unteren Ebenen-Eigenschaften in Ref<T> für Vue 3 umwandeln kann.
// Start with some type T
type T = ...
// And a 'function' to apply, U
type U<T> = ...
// This needs to apply U to all bottom level properties of T
// ('bottom level' are all props who's type does not extend object)
type DeepApply<T,U> = ???
Beispiel :
{
a: string,
b: number,
c: {
c1: number,
c2: string
}
}
Würde werden
{
a: Ref<string>,
b: Ref<number>,
c: {
c1: Ref<number>,
c2: Ref<string>
}
}
Hier ist mein bester Versuch, aber TS wirft einen Fehler sowohl, wenn versucht wird, einem Generikum seine eigenen generischen Argumente zu geben (U<T[P]>), als auch wenn versucht wird, einen Typ mit Generika als Generikum zu übergeben, ohne seine Generika explizit zu definieren (DeepApply<T, Ref>).
type DeepApply<T, U> = {
[P in keyof T]: T[P] extends object ? DeepUnion<T[P], U> : U<T[P]>;
};
type MyRefType = DeepApply<MyType, Ref>
Antwort #1
Wenn auf einen Typ verwiesen wird, müssen all seine generischen Parameter erfüllt sein. Anders ausgedrückt, man kann keinen parametrisierten Typ ohne Parameter übergeben, um seine Parameter später ausfüllen zu lassen. Dafür gibt es einfach keine Syntax.
Sie können es jedoch tun, wenn Sie den Ref-Typ fest codieren. Zum Beispiel:
type DeepApplyRef<T> = {
[P in keyof T]: T[P] extends object ? DeepApplyRef<T[P]> : Ref<T[P]>;
};
Ich glaube nicht, dass es eine Lösung gibt, die hier so dynamisch ist, wie du es willst. Wenn dein rekursiver Typ jedoch den Typ kennt, mit dem er die Dinge zusammenfasst, funktioniert dies ganz gut.
Spielplatz
