Zobecnění keyof v TypeScriptu rubrika: Programování: JavaScript

5 vit.herman
položil/-a 28.9. 10:31
 
upravil/-a 28.9. 10:32

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";
odkaz Vyřešeno
5 dominios
odpověděl/-a 25.2. 8:53
 
upravil/-a 25.2. 8:59

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.

Komentáře

  • vit.herman : Díky moc! Naopak, řešení přes dot notaci by bylo i pro mne ještě mnohem lepší. Jen jsem netušil, že by něco takového mohlo být možné. Už se těším, až se k tomu dostanu a budu moct tato řešení prozkoumat. 25.2. 22:54
  • vit.herman : Vyřešeno! Řešení jsem ještě rozšířil o generický parametr, kterým mohu omezit množinu cest pouze na cesty k fieldům daného typu. 27.9. 13:59

Pro zobrazení všech 2 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.