TypeScript Academy · Oppitunti

DeepPartial ja DeepReadonly

Rakentakaa rekursiiviset versiot Partial- ja Readonly-tyypeistä

Oppitunti 1/413 vaihetta

DeepPartial ja DeepReadonly on ilmainen TypeScript Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu TypeScript Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. TypeScript Academy-kurssilla on yhteensä 4 oppituntia.

Miksi syviä utility-tyyppejä tarvitaan

Sisäänrakennetut Partial- ja Readonly-tyypit koskevat vain yhtä tasoa. Sisäkkäisiä objekteja varten tarvitaan rekursiiviset versiot.

interface Config {
  db: { host: string; port: number };
  app: { name: string };
}
type Shallow = Partial<Config>;
// Shallow.db is still required — only top level is optional

DeepPartialin toteuttaminen

Käykää objektin ominaisuudet rekursiivisesti läpi ja tehkää jokaisesta valinnainen. Käyttäkää DeepPartial-tyyppiä rekursiivisesti, jos ominaisuuden arvo on objekti.

type DeepPartial<T> = T extends object
  ? { [K in keyof T]?: DeepPartial<T[K]> }
  : T;

DeepPartial käytännössä

Soveltakaa DeepPartial-tyyppiä sisäkkäiseen konfiguraatiotyyppiin ja tarkastelkaa, kuinka kaikki tasot muuttuvat valinnaisiksi.

type PartialConfig = DeepPartial<Config>;
// PartialConfig.db?: { host?: string; port?: number }

const c: PartialConfig = { db: { host: "localhost" } };
// No error — all other fields are optional

DeepReadOnlyn toteuttaminen

Tehkää jokaisesta ominaisuudesta kaikilla syvyystasoilla readonly rekursiivisesti sisäkkäisiin objektityyppeihin siirtymällä.

type DeepReadonly<T> = T extends object
  ? { readonly [K in keyof T]: DeepReadonly<T[K]> }
  : T;

DeepReadonly käytännössä

Syvästi jäädytettyä konfiguraatiota ei voi muuttaa millään tasolla.

type ReadonlyConfig = DeepReadonly<Config>;
const cfg: ReadonlyConfig = { db: { host: "localhost", port: 5432 }, app: { name: "my-app" } };
// cfg.db.port = 3000; // Error: readonly

Taulukoiden käsitteleminen syvissä tyypeissä

Taulukot tarvitsevat erityiskäsittelyä: kartoittakaa alkiotyypit rekursiivisesti sen sijaan, että käsittelisitte taulukoita tavallisina objekteina.

type DeepPartial<T> =
  T extends (infer U)[]
    ? DeepPartial<U>[]
    : T extends object
      ? { [K in keyof T]?: DeepPartial<T[K]> }
      : T;

Primitiiivityyppien käsitteleminen

Rekursion perustapauksen on palautettava primitiivityypit sellaisinaan, eikä niitä pidä kääriä objektin mapattuun tyyppiin.

type DeepReadonly<T> =
  T extends string | number | boolean | null | undefined ? T
  : T extends (infer U)[] ? ReadonlyArray<DeepReadonly<U>>
  : { readonly [K in keyof T]: DeepReadonly<T[K]> };

DeepPartialin ja DeepReadOnlyn yhdistäminen

Voitte yhdistää ne luodaksenne syvästi osittaisen ja vain luku -tyypin turvallisia konfiguraatiokorjauksia varten.

type SafePatch<T> = DeepReadonly<DeepPartial<T>>;

Suorituskykynäkökohdat

Hyvin suurten objektien rekursiiviset tyypit voivat hidastaa TypeScriptin tyyppitarkistusta. Suorituskykykriittisessä koodissa kannattaa harkita syvyysrajoja tai laiskaa evaluointia.

// For very deep schemas, consider using Zod or io-ts
// which provide runtime + compile-time deep typing

Käytännön käyttö: React-tilan korjausobjektit

DeepPartial sopii erinomaisesti tilan korjausfunktioihin, jotka hyväksyvät vain suuresta tilaobjektista muuttuneen osajoukon.

function patch<T>(state: T, changes: DeepPartial<T>): T {
  return { ...state, ...changes } as T;
}

Kertaus: Syvät utility-tyypit

DeepPartial ja DeepReadonly ovat rekursiivisia mapattuja tyyppejä, jotka soveltavat muuntajansa sisäkkäisen objektin jokaiselle tasolle. Käsitelkää taulukot erikseen ja käyttäkää primitiivityypeille perustapauksia.

Pikatarkistus

Mikä on DeepPartial-tyypin oikea rekursiivinen perustapaus?

Mitä opitte

Toteutitte DeepPartial- ja DeepReadonly-tyypit rekursiivisten mapattujen tyyppien avulla. Käsitelkää taulukot erikoistapauksena ja palauttakaa primitiivityypit perustapauksessa aina muuttamattomina.

Aloita maksutta

Opi TypeScript tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
101
Oppitunnit
352

Usein kysytyt kysymykset

Onko oppitunti ”DeepPartial ja DeepReadonly” ilmainen?

Kyllä – oppitunnin ”DeepPartial ja DeepReadonly” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko TypeScript Academy-kurssin, päivitä CoddyKit PROhon. TypeScript Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”DeepPartial ja DeepReadonly”?

Rakentakaa rekursiiviset versiot Partial- ja Readonly-tyypeistä Harjoittelet TypeScript Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni TypeScript Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin TypeScript Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”DeepPartial ja DeepReadonly”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä TypeScript Academy-oppitunnilla?

Kyllä. Jokainen TypeScript Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. DeepPartial ja DeepReadonly
  2. Flatten- ja UnwrapPromise-utilityt
  3. TupleToUnion ja UnionToIntersection
  4. Tyyppiutilitykirjaston julkaiseminen
← Takaisin: TypeScript Academy