Introduktion til TypeScript Type Guards
Typevagter er en kraftfuld funktion i TypeScript, der giver udviklere mulighed for at udføre runtime-tjek for at indsnævre typen af en variabel. Dette sikrer mere præcis typeinformation, hvilket fører til sikrere og mere forudsigelig kode. Denne artikel undersøger, hvilken type vagter er, og hvordan man bruger dem effektivt.
Hvad er typebeskyttere?
Typevagter er udtryk, der udfører runtime-tjek og tillader TypeScript at udlede en mere specifik type for en variabel. De hjælper med at skelne mellem forskellige typer, især når de har at gøre med fagforeningstyper. Typebeskyttere kan implementeres ved hjælp af forskellige teknikker, herunder:
- Brugerdefinerede typeprædikater
- Type påstande
- Instanstjek
- Brug af
typeof
operatoren - Brug af
in
operatoren
Brugerdefinerede typeprædikater
Brugerdefinerede typeprædikater er funktioner, der returnerer en boolesk værdi og har en speciel returtype, der angiver typen af den variable, der kontrolleres. Sådan opretter og bruger du dem:
function isString(value: any): value is string {
return typeof value === 'string';
}
function printString(value: any) {
if (isString(value)) {
console.log(value.toUpperCase()); // TypeScript knows value is a string here
} else {
console.log('Not a string');
}
}
I eksemplet ovenfor er isString
et brugerdefineret typeprædikat, der hjælper TypeScript med at forstå, at værdi
er en streng i if
-blokken.
Type påstande
Typepåstande fortæller TypeScript at behandle en variabel som en bestemt type. Denne metode udfører ikke et runtime-tjek, men informerer TypeScript-kompileren om typen. For eksempel:
function printLength(value: any) {
console.log((value as string).length); // Assert value is a string
}
I dette eksempel fortæller værdi som streng
TypeScript at antage, at værdi
er en streng uden at udføre en kørselstidskontrol.
Forekomstkontrol
Forekomstkontrol bruges til at bestemme, om et objekt er en forekomst af en bestemt klasse. Dette er nyttigt til at indsnævre typer, når du arbejder med klasser:
class Dog {
bark() { console.log('Woof'); }
}
class Cat {
meow() { console.log('Meow'); }
}
function speak(animal: Dog | Cat) {
if (animal instanceof Dog) {
animal.bark(); // TypeScript knows animal is a Dog here
} else {
animal.meow(); // TypeScript knows animal is a Cat here
}
}
I dette eksempel hjælper operatoren instanceof
TypeScript med at udlede typen af animal
baseret på dens klasse.
Brug af type
-operatøren
Operatoren typeof
kan bruges til at kontrollere primitive typer såsom streng
, tal
og boolean
:
function processValue(value: string | number) {
if (typeof value === 'string') {
console.log(value.toUpperCase()); // TypeScript knows value is a string here
} else {
console.log(value.toFixed(2)); // TypeScript knows value is a number here
}
}
Her bruges typeof
til at kontrollere, om værdi
er en streng
eller et tal
og indsnævrer typen tilsvarende.
Brug af in
operatøren
Operatoren in
kontrollerer tilstedeværelsen af en egenskab i et objekt. Dette er nyttigt til at skelne mellem typer, der deler fælles egenskaber:
interface Bird {
fly: () => void;
}
interface Fish {
swim: () => void;
}
function move(creature: Bird | Fish) {
if ('fly' in creature) {
creature.fly(); // TypeScript knows creature is a Bird here
} else {
creature.swim(); // TypeScript knows creature is a Fish here
}
}
I dette eksempel hjælper in
-operatoren TypeScript med at bestemme, om væsen
er en Bird
eller en Fish
baseret på tilstedeværelsen af en metode.
Konklusion
TypeScript-typeafskærmninger er vigtige værktøjer til at arbejde med typer på en fleksibel og sikker måde. De giver mulighed for mere præcis typekontrol og kan forhindre runtime-fejl ved at sikre, at den korrekte type bruges i forskellige scenarier. At forstå og bruge typebeskyttelser effektivt kan føre til mere robust og vedligeholdelig TypeScript-kode.