Svenska

Lås upp kraften i TypeScript const assertions för oföränderlig typinferens, vilket förbättrar kodsäkerhet och förutsägbarhet i dina projekt. Lär dig använda dem effektivt med praktiska exempel.

TypeScript Const Assertions: Oföränderlig typinferens för robust kod

TypeScript, en överbyggnad till JavaScript, introducerar statisk typning i den dynamiska världen av webbutveckling. En av dess kraftfulla funktioner är typinferens, där kompilatorn automatiskt härleder typen av en variabel. Const assertions, som introducerades i TypeScript 3.4, tar typinferens ett steg längre genom att låta dig upprätthålla oföränderlighet och skapa mer robust och förutsägbar kod.

Vad är Const Assertions?

Const assertions är ett sätt att tala om för TypeScript-kompilatorn att du avser att ett värde ska vara oföränderligt. De tillämpas med syntaxen as const efter ett literalt värde eller uttryck. Detta instruerar kompilatorn att härleda den snävaste möjliga (litterala) typen för uttrycket och markera alla egenskaper som readonly.

I grund och botten ger const assertions en starkare nivå av typsäkerhet än att bara deklarera en variabel med const. Medan const förhindrar omtilldelning av själva variabeln, hindrar det inte modifiering av objektet eller arrayen som variabeln refererar till. Const assertions förhindrar även modifiering av objektets egenskaper.

Fördelar med att använda Const Assertions

Praktiska exempel

Exempel 1: Grundläggande användning med en literal

Utan en const assertion härleder TypeScript typen av message som string:


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

Med en const assertion härleder TypeScript typen som den litterala strängen "Hello, World!":


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

Detta gör att du kan använda den litterala strängtypen i mer exakta typdefinitioner och jämförelser.

Exempel 2: Använda Const Assertions med arrayer

Tänk dig en array med färger:


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

Även om arrayen är deklarerad med const, kan du fortfarande ändra dess element:


colors[0] = "purple"; // Inget fel
console.log(colors); // Output: ["purple", "green", "blue"]

Genom att lägga till en const assertion härleder TypeScript arrayen som en tupel av skrivskyddade strängar:


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

Nu kommer ett försök att ändra arrayen att resultera i ett TypeScript-fel:


// colors[0] = "purple"; // Fel: Index signature in type 'readonly ["red", "green", "blue"]' only permits reading.

Detta säkerställer att colors-arrayen förblir oföränderlig.

Exempel 3: Använda Const Assertions med objekt

Liksom arrayer kan även objekt göras oföränderliga med const assertions:


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

Även med const kan du fortfarande ändra egenskaperna hos person-objektet:


person.age = 31; // Inget fel
console.log(person); // Output: { name: "Alice", age: 31 }

Att lägga till en const assertion gör objektets egenskaper readonly:


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

Nu kommer ett försök att ändra objektet att resultera i ett TypeScript-fel:


// person.age = 31; // Fel: Cannot assign to 'age' because it is a read-only property.

Exempel 4: Använda Const Assertions med nästlade objekt och arrayer

Const assertions kan tillämpas på nästlade objekt och arrayer för att skapa djupt oföränderliga datastrukturer. Tänk på följande exempel:


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

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

I det här exemplet är config-objektet, dess nästlade endpoints-objekt och supportedLanguages-arrayen alla markerade som readonly. Detta säkerställer att ingen del av konfigurationen kan ändras oavsiktligt under körning.

Exempel 5: Const Assertions med funktioners returtyper

Du kan använda const assertions för att säkerställa att en funktion returnerar ett oföränderligt värde. Detta är särskilt användbart när man skapar hjälpfunktioner som inte ska ändra sin indata eller producera föränderlig utdata.


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

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

// Typ av immutableNumbers: readonly [1, 2, 3]

// immutableNumbers[0] = 4; // Fel: Index signature in type 'readonly [1, 2, 3]' only permits reading.

Användningsfall och scenarier

Konfigurationshantering

Const assertions är idealiska för att hantera applikationskonfiguration. Genom att deklarera dina konfigurationsobjekt med as const kan du säkerställa att konfigurationen förblir konsekvent under hela applikationens livscykel. Detta förhindrar oavsiktliga ändringar som kan leda till oväntat beteende.


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

Definiera konstanter

Const assertions är också användbara för att definiera konstanter med specifika litterala typer. Detta kan förbättra typsäkerhet och kodtydlighet.


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

Arbeta med Redux eller andra state-hanteringsbibliotek

I state-hanteringsbibliotek som Redux är oföränderlighet en kärnprincip. Const assertions kan hjälpa till att upprätthålla oföränderlighet i dina reducers och action creators, vilket förhindrar oavsiktliga tillståndsmutationer.


// Exempel på Redux reducer

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;
  }
}

Internationalisering (i18n)

När man arbetar med internationalisering har man ofta en uppsättning språk som stöds och deras motsvarande språkkoder. Const assertions kan säkerställa att denna uppsättning förblir oföränderlig, vilket förhindrar oavsiktliga tillägg eller ändringar som kan förstöra din i18n-implementering. Tänk dig till exempel att du stöder engelska (en), franska (fr), tyska (de), spanska (es) och japanska (ja):


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

type SupportedLanguage = typeof supportedLanguages[number]; // Typ: "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 "Hälsning är inte tillgänglig för detta språk.";
  }
}

Begränsningar och överväganden

Alternativ till Const Assertions

Även om const assertions är ett kraftfullt verktyg för att upprätthålla oföränderlighet, finns det andra tillvägagångssätt du kan överväga:

Bästa praxis

Slutsats

TypeScript const assertions är ett värdefullt verktyg för att upprätthålla oföränderlighet och förbättra typsäkerheten i din kod. Genom att använda as const kan du instruera kompilatorn att härleda den snävaste möjliga typen för ett värde och markera alla egenskaper som readonly. Detta kan hjälpa till att förhindra oavsiktliga ändringar, förbättra kodens förutsägbarhet och möjliggöra mer exakt typkontroll. Även om const assertions har vissa begränsningar är de ett kraftfullt tillägg till TypeScript-språket och kan avsevärt förbättra robustheten i dina applikationer.

Genom att strategiskt införliva const assertions i dina TypeScript-projekt kan du skriva mer tillförlitlig, underhållbar och förutsägbar kod. Omfamna kraften i oföränderlig typinferens och lyft din mjukvaruutvecklingspraxis.