Suomi

Hyödynnä TypeScriptin const-assertioiden teho muuttumattomaan tyyppipäättelyyn, parantaen koodin turvallisuutta ja ennustettavuutta. Opi niiden tehokas käyttö esimerkein.

TypeScriptin Const-assertiot: Muuttumaton tyyppipäättely vankkaan koodiin

TypeScript, JavaScriptin superjoukko, tuo staattisen tyypityksen dynaamiseen web-kehityksen maailmaan. Yksi sen tehokkaista ominaisuuksista on tyyppipäättely, jossa kääntäjä päättelee automaattisesti muuttujan tyypin. TypeScript 3.4:ssä esitellyt const-assertiot vievät tyyppipäättelyn askeleen pidemmälle, mahdollistaen muuttumattomuuden pakottamisen ja vankemman sekä ennustettavamman koodin luomisen.

Mitä ovat Const-assertiot?

Const-assertiot ovat tapa kertoa TypeScript-kääntäjälle, että arvon on tarkoitus olla muuttumaton. Niitä käytetään as const -syntaksilla literaaliarvon tai lausekkeen jälkeen. Tämä ohjeistaa kääntäjää päättelemään lausekkeelle mahdollisimman tarkan (literaali)tyypin ja merkitsemään kaikki ominaisuudet readonly-määreellä.

Pohjimmiltaan const-assertiot tarjoavat vahvemman tyyppiturvallisuuden tason kuin pelkkä muuttujan julistaminen const-määreellä. Vaikka const estää itse muuttujan uudelleensijoituksen, se ei estä muuttujan viittaaman olion tai taulukon muokkaamista. Const-assertiot estävät myös olion ominaisuuksien muokkaamisen.

Const-assertioiden käytön edut

Käytännön esimerkkejä

Esimerkki 1: Peruskäyttö literaalin kanssa

Ilman const-assertiota TypeScript päättelee message-muuttujan tyypiksi string:


const message = "Hello, World!"; // Tyyppi: string

Const-assertiolla TypeScript päättelee tyypiksi literaalimerkkijonon "Hello, World!":


const message = "Hello, World!" as const; // Tyyppi: "Hello, World!"

Tämä mahdollistaa literaalimerkkijonotyypin käytön tarkemmissa tyyppimäärityksissä ja vertailuissa.

Esimerkki 2: Const-assertioiden käyttö taulukoiden kanssa

Tarkastellaan väritaulukkoa:


const colors = ["red", "green", "blue"]; // Tyyppi: string[]

Vaikka taulukko on määritelty const-määreellä, sen elementtejä voi silti muokata:


colors[0] = "purple"; // Ei virhettä
console.log(colors); // Tuloste: ["purple", "green", "blue"]

Lisäämällä const-assertion, TypeScript päättelee taulukon tyypiksi vain luku -ominaisuudella varustetun merkkijonotuplen:


const colors = ["red", "green", "blue"] as const; // Tyyppi: readonly ["red", "green", "blue"]

Nyt taulukon muokkausyritys aiheuttaa TypeScript-virheen:


// colors[0] = "purple"; // Virhe: Tyyppi 'readonly ["red", "green", "blue"]' sallii vain lukemisen.

Tämä varmistaa, että colors-taulukko pysyy muuttumattomana.

Esimerkki 3: Const-assertioiden käyttö olioiden kanssa

Taulukoiden tapaan myös oliot voidaan tehdä muuttumattomiksi const-assertioilla:


const person = {
  name: "Alice",
  age: 30,
}; // Tyyppi: { name: string; age: number; }

Jopa const-määreellä voit silti muokata person-olion ominaisuuksia:


person.age = 31; // Ei virhettä
console.log(person); // Tuloste: { name: "Alice", age: 31 }

Lisäämällä const-assertion olion ominaisuuksista tulee readonly:


const person = {
  name: "Alice",
  age: 30,
} as const; // Tyyppi: { readonly name: "Alice"; readonly age: 30; }

Nyt olion muokkausyritys aiheuttaa TypeScript-virheen:


// person.age = 31; // Virhe: Ominaisuuteen 'age' ei voi sijoittaa, koska se on vain luku -ominaisuus.

Esimerkki 4: Const-assertioiden käyttö sisäkkäisten olioiden ja taulukoiden kanssa

Const-assertioita voidaan soveltaa sisäkkäisiin olioihin ja taulukoihin syvästi muuttumattomien tietorakenteiden luomiseksi. Tarkastellaan seuraavaa esimerkkiä:


const config = {
  apiUrl: "https://api.example.com",
  endpoints: {
    users: "/users",
    products: "/products",
  },
  supportedLanguages: ["en", "fr", "de"],
} as const;

// Tyyppi:
// {
//   readonly apiUrl: "https://api.example.com";
//   readonly endpoints: {
//     readonly users: "/users";
//     readonly products: "/products";
//   };
//   readonly supportedLanguages: readonly ["en", "fr", "de"];
// }

Tässä esimerkissä config-olio, sen sisäkkäinen endpoints-olio ja supportedLanguages-taulukko on kaikki merkitty readonly-määreellä. Tämä varmistaa, ettei mitään konfiguraation osaa voi vahingossa muokata ajon aikana.

Esimerkki 5: Const-assertiot funktioiden paluuarvojen tyypeissä

Voit käyttää const-assertioita varmistaaksesi, että funktio palauttaa muuttumattoman arvon. Tämä on erityisen hyödyllistä luotaessa aputoimintoja, joiden ei pitäisi muokata syötettään tai tuottaa muuttuvaa tulosta.


function createImmutableArray(items: T[]): readonly T[] {
  return [...items] as const;
}

const numbers = [1, 2, 3];
const immutableNumbers = createImmutableArray(numbers);

// Tyyppi immutableNumbers: readonly [1, 2, 3]

// immutableNumbers[0] = 4; // Virhe: Tyyppi 'readonly [1, 2, 3]' sallii vain lukemisen.

Käyttötapaukset ja skenaariot

Konfiguraation hallinta

Const-assertiot ovat ihanteellisia sovelluksen konfiguraation hallintaan. Määrittämällä konfiguraatio-oliot as const -määreellä voit varmistaa, että konfiguraatio pysyy johdonmukaisena koko sovelluksen elinkaaren ajan. Tämä estää tahattomat muutokset, jotka voisivat johtaa odottamattomaan käyttäytymiseen.


const appConfig = {
  appName: "My Application",
  version: "1.0.0",
  apiEndpoint: "https://api.example.com",
} as const;

Vakioiden määrittely

Const-assertiot ovat hyödyllisiä myös määriteltäessä vakioita tietyillä literaalityypeillä. Tämä voi parantaa tyyppiturvallisuutta ja koodin selkeyttä.


const HTTP_STATUS_OK = 200 as const; // Tyyppi: 200
const HTTP_STATUS_NOT_FOUND = 404 as const; // Tyyppi: 404

Työskentely Reduxin tai muiden tilanhallintakirjastojen kanssa

Tilanhallintakirjastoissa, kuten Reduxissa, muuttumattomuus on keskeinen periaate. Const-assertiot voivat auttaa pakottamaan muuttumattomuuden reducereissäsi ja action creatoreissasi, estäen vahingossa tapahtuvia tilan mutaatioita.


// Esimerkki Redux-reducerista

interface State {
  readonly count: number;
}

const initialState: State = { count: 0 } as const;

function reducer(state: State = initialState, action: { type: string }): State {
  switch (action.type) {
    default:
      return state;
  }
}

Kansainvälistäminen (i18n)

Kansainvälistämisen parissa työskennellessäsi sinulla on usein joukko tuettuja kieliä ja niitä vastaavat kielikoodit. Const-assertiot voivat varmistaa, että tämä joukko pysyy muuttumattomana, estäen tahattomat lisäykset tai muutokset, jotka voisivat rikkoa i18n-toteutuksesi. Kuvitellaan esimerkiksi, että tuet englantia (en), ranskaa (fr), saksaa (de), espanjaa (es) ja japania (ja):


const supportedLanguages = ["en", "fr", "de", "es", "ja"] as const;

type SupportedLanguage = typeof supportedLanguages[number]; // Tyyppi: "en" | "fr" | "de" | "es" | "ja"

function greet(language: SupportedLanguage) {
  switch (language) {
    case "en":
      return "Hello!";
    case "fr":
      return "Bonjour!";
    case "de":
      return "Guten Tag!";
    case "es":
      return "¡Hola!";
    case "ja":
      return "こんにちは!";
    default:
      return "Tervehdys ei ole saatavilla tällä kielellä.";
  }
}

Rajoitukset ja huomiot

Vaihtoehtoja Const-assertioille

Vaikka const-assertiot ovat tehokas työkalu muuttumattomuuden pakottamiseen, on olemassa muita lähestymistapoja, joita voit harkita:

Parhaat käytännöt

Johtopäätös

TypeScriptin const-assertiot ovat arvokas työkalu muuttumattomuuden pakottamiseen ja tyyppiturvallisuuden parantamiseen koodissasi. Käyttämällä as const -määrettä voit ohjeistaa kääntäjää päättelemään arvolle mahdollisimman tarkan tyypin ja merkitsemään kaikki ominaisuudet readonly-määreellä. Tämä voi auttaa estämään tahattomia muutoksia, parantamaan koodin ennustettavuutta ja mahdollistamaan tarkemman tyyppitarkistuksen. Vaikka const-assertioilla on joitain rajoituksia, ne ovat tehokas lisä TypeScript-kieleen ja voivat merkittävästi parantaa sovellustesi vakautta.

Sisällyttämällä const-assertioita strategisesti TypeScript-projekteihisi voit kirjoittaa luotettavampaa, ylläpidettävämpää ja ennustettavampaa koodia. Ota haltuun muuttumattoman tyyppipäättelyn voima ja nosta ohjelmistokehityskäytäntöjesi tasoa.

TypeScriptin Const-assertiot: Muuttumaton tyyppipäättely vankkaan koodiin | MLOG