Njengoba i-typescript ikhula futhi ithola ukuduma muva nje, abathuthukisi be-javascript abaningi ngokwengeziwe bayakwazisa ukuphepha kohlobo. Uhlu lwezici ezihlinzekwa yi-Typescript lukhulu futhi lungase lube lukhulu, ngakho-ke kulokhu okuthunyelwe, ngizogxila kweyodwa yazo okulula ukuyiqonda futhi enomthelela omuhle ekusebenzeni.
Ake siqale ngesibonelo. Cabanga uthuthukisa uhlelo lokusebenza olunezindima eziningi zabasebenzisi. Kuyinto evamile ukuthi uhlelo lokusebenza ludliwe abasebenzisi abahlukene, akunjalo? Izindima azibalulekile ngempela lapha, kodwa ake sithi admin
, consumer
kanye guest
. Ngombhalo wokubhala, singamemezela abasebenzisi ababambe lezo zindima ngale ndlela elandelayo:
type Admin = {} type Consumer = {} type Guest = {}
Manje, ake sicabangele isethi yezibaluli indima ngayinye yomsebenzisi enazo. Ngokuvamile, email
, firstName
kanye lastName
noma into efana naleyo. Kodwa, linda, Abasebenzisi Guest
cishe ngeke babe nazo (izivakashi phela), ngakho-ke asivele silushiye lungenalutho lolu hlobo okwamanje.
type Admin = { firstName: string lastName: string email: string } type Consumer = { firstName: string lastName: string email: string } type Guest = {}
Umsebenzisi wohlelo lokusebenza angaba nendima eyodwa kuphela. Indlela yokumela lokhu ngezinhlobo ukusebenzisa uhlobo union
.
type User = Admin | Consumer | Guest
Abaphathi badume ngamakhono abo akhethekile, futhi esicelweni sethu bayakwazi ukumema abathengi. Ake sengeze inkambu ebonisa ukuthi zingaki izimemo umlawuli angathumela.
type Admin = { firstName: string lastName: string email: string numberOfInvitesLeft: number // <-- added }
Ukwenza izinto zihehe kakhudlwana futhi sisondele kuhlelo lokusebenza lwangempela, ake sengeze isakhiwo esikhethekile ohlotsheni Consumer
.
type Consumer = { firstName: string lastName: string email: string premium: boolean // <-- added }
Lesi isibonelo esilula kakhulu, futhi empeleni, abasebenzisi bangaba nenqwaba yezakhiwo ezihlukene, okwenza kube nzima kakhulu i-codebase uma udinga ukufinyelela izakhiwo ezithile.
const doSomethingBasedOnRole = (user: User) => { // how do you check here that user is really an admin if (user) { // ...and do something with the `numberOfInvitesLeft` property? } }
Enye inketho ukuhlola ubukhona bendawo.
const doSomethingBasedOnRole = (user: User) => { if (user && user.numberOfInvitesLeft) { // safely access `numberOfInvitesLeft` property } }
Kodwa lokhu kuyisixazululo esiyisicefe futhi akusona i-scalable. Futhi yini okufanele uyenze uma `numberOfInvitesLeft` iba indawo ozikhethela yona?
Yilapho izinhlobo zezinyunyana ezicwaswayo ziqala khona ukudlala. Sidinga nje ukubeka inkambu eyengeziwe kulo lonke uhlobo lomsebenzisi olubonisa indima.
type Admin = { firstName: string lastName: string email: string numberOfInvitesLeft: number role: "admin" // <-- added } type Consumer = { firstName: string lastName: string email: string role: "consumer" // <-- added } type Guest = { role: "guest" // <-- added }
Qaphela ukuthi ngilubeka kanjani uchungechunge oluthile njengohlobo; lokhu kubizwa ngokuthi uhlobo lweyunithi yezinhlamvu . Lokhu okukunika kona ukuthi manje ungasebenzisa o-opharetha bolimi lwe-JS, isb , switch case
, if
, ukuze else
indima.
const user: Admin = { firstName: "John", lastName: "Smith", email: "[email protected]", numberOfInvitesLeft: 3, role: "admin", } const doSomethingBasedOnRole = (user: User) => { if (user.role === "admin") { // now typescript knows that INSIDE of this block user is of type `Admin` // now you can safely call `user.numberOfInvitesLeft` within this block } }
Okufanayo kuyasebenza esitatimendeni secala lokushintshwa.
// ... const doSomethingBasedOnRole = (user: User) => { switch (user.role) { case "admin": { // now typescript knows that INSIDE of this block user is of type `Admin` // now you can safely call `user.numberOfInvitesLeft` within this block } case "consumer": { // do something with a `Consumer` user // if you try to call `user.numberOfInvitesLeft` here, TS compiler errors in // // "Property 'numberOfInvitesLeft' does not exist on type 'Consumer'." // } } }
Izinzuzo zezinhlobo zezinyunyana ezicwaswayo zisobala ngenxa yokuthi ukuhlola kohlobo kusekelwe endimeni yendima esobala futhi hhayi ezakhiweni zesikhangiso okungenzeka noma ezingahlobene nomsebenzisi othile.