Brand- eli opaakit tyypit yksikköjen sekoittumisen estämiseen
Estäkää yksiköiden ja tunnisteiden sekoittuminen yhdistämällä perustyyppeihin phantom-brand-ominaisuuksia; luokaa arvot ainoastaan factory-funktioilla.
Brand- eli opaakit tyypit yksikköjen sekoittumisen estämiseen on ilmainen TypeScript Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/3. 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ä 3 oppituntia.
Johdanto
Tavoite: Erottakaa toisiaan muistuttavat arvot tyyppitasolla. Tavallinen number ei erota metrejä sekunneista, mutta brand-merkintä voi tehdä sen.
- Ei ajonaikaista lisäkustannusta
- Turvallisemmat API:t ja refaktoroinnit
- Luokaa arvot vain tehdasfunktioilla
Primitiivisten yksiköiden brändäys
Brand-merkinnät pitävät yksiköt erillään käännösvaiheessa; väärä argumenttijärjestys aiheuttaa tyyppivirheen.
type Meter = number & { readonly __brand: "meter" }
type Second = number & { readonly __brand: "second" }
function meter(n: number): Meter { return n as Meter }
function second(n: number): Second { return n as Second }
const d = meter(100)
const t = second(9)
function speed(dist: Meter, time: Second) { return (dist as number) / (time as number) }
// speed(t, d) // compile error: brands do not matchGeneerinen brand-apuohjelma
Käyttäkää geneeristä Brand-apuohjelmaa eri toimialoilla: tyypitettyihin tunnisteisiin, tunnuksiin, kohdistimiin ja niin edelleen.
type Brand<Tag extends string, T> = T & { readonly __brand: Tag }
type UserId = Brand<"UserId", string>
type OrderId = Brand<"OrderId", string>
function userId(x: string): UserId { return x as UserId }
function orderId(x: string): OrderId { return x as OrderId }
function findUser(id: UserId) { /* ... */ }
const u = userId("u_123")
const o = orderId("o_456")
// findUser(o) // error: OrderId not assignable to UserIdunique symbol -brändi
unique symbol -brändi estää nimien törmäykset ja päätymisen globaaleihin nimiavaruuksiin.
declare const MeterSym: unique symbol
type Meter2 = number & { readonly [MeterSym]: "meter" }
function asMeter2(n: number): Meter2 { return n as Meter2 }
const m2 = asMeter2(5)
// const wrong: Meter2 = 5 // discourage raw assignment; prefer factoriesTehdasfunktiot ja validointi
Antakaa brändi tehdasfunktiossa: validoikaa ensin, brändätkää sitten ja käyttäkää lopuksi. Välttäkää tapauskohtaisia as-tyypityksiä kutsukohdissa.
type NonEmptyString = string & { readonly __brand: "NonEmpty" }
function nonEmpty(s: string): NonEmptyString | null {
return s.trim().length > 0 ? (s as NonEmptyString) : null
}
function makeSlug(s: NonEmptyString) {
return (s as string).toLowerCase().replace(/\s+/g, "-")
}
const ok = nonEmpty(" Hello ")
if (ok) { makeSlug(ok) } // safe: validated & branded firstVinkit ja sudenkuopat
Parhaat käytännöt:
- Pitäkää brändien nimet lyhyinä ja merkityksellisinä.
- Tarjotkaa tehdasfunktiot ainoana tapana hankkia brändättyjä arvoja.
- Älkää paljastako brändejä julkisten API-tyyppien kautta, ellei se ole tarpeen.
- Brändit ovat vain tyyppitasolla: ajonaikaista lisäkustannusta ei ole.
Brändäyksen tarkistus
Pikatarkistus: Mikä kuvio estää yksiköiden ja tunnisteiden sekoittumisen?
Kertaus
Kertaus: Brändätyt ja opaakit tyypit erottavat samannäköiset arvot toisistaan (metrit ja sekunnit, UserId ja OrderId). Tuottakaa ne tehdasfunktioilla, käyttäkää niitä APIen läpi ja poistakaa tahattomat sekoitukset.
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 ”Brand- eli opaakit tyypit yksikköjen sekoittumisen estämiseen” ilmainen?
Kyllä – oppitunnin ”Brand- eli opaakit tyypit yksikköjen sekoittumisen estämiseen” 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ä 3 oppituntia.
Mitä opin oppitunnilla ”Brand- eli opaakit tyypit yksikköjen sekoittumisen estämiseen”?
Estäkää yksiköiden ja tunnisteiden sekoittuminen yhdistämällä perustyyppeihin phantom-brand-ominaisuuksia; luokaa arvot ainoastaan factory-funktioilla. 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/3.
Kuinka kauan ”Brand- eli opaakit tyypit yksikköjen sekoittumisen estämiseen”-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
- Brand- eli opaakit tyypit yksikköjen sekoittumisen estämiseen
- Tunnisteelliset ID:t ja toimialamallinnuksen rakenteet
- Toimialamallinnus — aggregaatit, invariantit ja palvelut