Zobecnění keyof v TypeScriptu rubrika: Programování: JavaScript
Zdravím všechny,
rád bych zobecnil typ keyof x
v TypeScriptu tak, abych mohl odkazovat do libovolné úrovně v objektu. Toto zobecnění nazvěme typovanou cestou.
Mějme objekt:
const person: Person = { jmeno: "Petr", prijmeni: "Novák", dite: { firstName: "Anna", lastName: "Nováková", vek: 5, hracka: { nazev: "pandulak" } } }
Stejně jako lze napsat:
const path: keyof Person ="jmeno";
tak bych potřeboval napsat:
const path: Path<Person> = ["dite", "hracka", "nazev"]
["dite", "hracka", "nazev"]
pochopitelně má být kontrolováno na úrovni kompilace, že se jedná o validní cestu. Zdá se mi, že toto současný TypeScript neumožňuje. Dokáže mne někdo případně vyvést z omylu?
Pokus, se kterým jsem se dostal nejdále, je dokumentován zde https://gist.github.com/vimanvh/a8ca22fc887d5fb72e02f5db968d34aa
Díky moc za případné rady.
VYŘEŠENO:
Zápis cesty je v dot notaci místo string[], "Object" je objekt, jehož cestu definuji, Value: typ hodnoty v dané cestě
type PathOf<Object extends object, Value> = { [Property in keyof Object & string]: Object[Property] extends Value ? `${Property}` : Object[Property] extends object ? `${Property}.${PathOf<Object[Property], Value>}` : never }[keyof Object & string];
Použití:
const path: PathOf<Person, string> = "dite.hracka.nazev";
Davnejsie som riesil takyto isty problem, ale bez vysledku. Kazdopadne, ty si polozil otazku (+David Macek nacrtol riesnie), ktore ma nasmerovalo konecne spravnym smerom :) Moja vlastna implementacia mala viacero chyb, az som sa googlenim nakoniec dostal na stackoverflow, kde je jedno velmi pekne riesenie: https://stackoverflow.com/questions/65332597/typescript-is-there-a-recur...
Nie je to opat uplne 100% to iste ako potrebujes (miesto keyof ako pole to bude string), ale zrejme by sa to dalo pouzit/upravit. Mne osobne vyhovuje o to viac, ze mne stacila validacia cez dot notaion, ktora teda ide krasne a bez problemov.
Pro zobrazení všech 2 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře