Uurige TypeScripti tüübivalvureid ja tüübikinnitusi, et parandada tüübiohutust, vältida käitusviga ning kirjutada vastupidavamat ja hooldatavamat koodi. Õppige praktiliste näidete ja parimate praktikate abil.
Tüübiohutuse meisterlikkus: põhjalik juhend tüübivalvuritele ja tüübikinnitustele
Tarkvaraarenduse valdkonnas, eriti dünaamiliselt tüübitud keeltega nagu JavaScript töötades, võib tüübiohutuse säilitamine olla märkimisväärne väljakutse. TypeScript, JavaScripti superkomplekt, lahendab selle mure, tuues sisse staatilise tüüpimise. Kuid isegi TypeScripti tüübisüsteemiga tekib olukordi, kus kompilaator vajab abi muutuja õige tüübi järeldamisel. Siin tulevad mängu tüübivalvurid ja tüübikinnitused. See põhjalik juhend süveneb nendesse võimsatesse funktsioonidesse, pakkudes praktilisi näiteid ja parimaid praktikaid teie koodi usaldusväärsuse ja hooldatavuse parandamiseks.
Mis on tüübivalvurid?
Tüübivalvurid on TypeScripti avaldised, mis kitsendavad muutuja tüüpi teatud skoobis. Need võimaldavad kompilaatoril mõista muutuja tüüpi täpsemalt, kui see esialgu järeldas. See on eriti kasulik, kui tegeletakse liittüüpidega või kui muutuja tüüp sõltub käitusaegsetest tingimustest. Tüübivalvureid kasutades saate vältida käitusvigu ja kirjutada robustsemat koodi.
Levinud tüübivalvurite tehnikad
TypeScript pakub mitmeid sisseehitatud mehhanisme tüübivalvurite loomiseks:
typeof
-operaator: Kontrollib muutuja primitiivset tüüpi (nt "string", "number", "boolean", "undefined", "object", "function", "symbol", "bigint").instanceof
-operaator: Kontrollib, kas objekt on konkreetse klassi eksemplar.in
-operaator: Kontrollib, kas objektil on konkreetne omadus.- Kohandatud tüübivalvuri funktsioonid: Funktsioonid, mis tagastavad tüübipredikaadi, mis on eriline tõeväärtusavaldise tüüp, mida TypeScript kasutab tüüpide kitsendamiseks.
typeof
-i kasutamine
typeof
-operaator on otsekohene viis muutuja primitiivse tüübi kontrollimiseks. See tagastab stringi, mis näitab tüüpi.
function printValue(value: string | number) {
if (typeof value === "string") {
console.log(value.toUpperCase()); // TypeScript teab, et 'value' on siin string
} else {
console.log(value.toFixed(2)); // TypeScript teab, et 'value' on siin number
}
}
printValue("hello"); // Väljund: HELLO
printValue(3.14159); // Väljund: 3.14
instanceof
-i kasutamine
instanceof
-operaator kontrollib, kas objekt on teatud klassi eksemplar. See on eriti kasulik pärilusega töötamisel.
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
}
class Dog extends Animal {
bark() {
console.log("Woof!");
}
}
function makeSound(animal: Animal) {
if (animal instanceof Dog) {
animal.bark(); // TypeScript teab, et 'animal' on siin Dog
} else {
console.log("Üldine looma häälitsus");
}
}
const myDog = new Dog("Buddy");
const myAnimal = new Animal("Generic Animal");
makeSound(myDog); // Väljund: Woof!
makeSound(myAnimal); // Väljund: Üldine looma häälitsus
in
-i kasutamine
in
-operaator kontrollib, kas objektil on konkreetne omadus. See on kasulik objektidega tegelemisel, millel võivad olla erinevad omadused sõltuvalt nende tüübist.
interface Bird {
fly(): void;
layEggs(): void;
}
interface Fish {
swim(): void;
layEggs(): void;
}
function move(animal: Bird | Fish) {
if ("fly" in animal) {
animal.fly(); // TypeScript teab, et 'animal' on siin Bird
} else {
animal.swim(); // TypeScript teab, et 'animal' on siin Fish
}
}
const myBird: Bird = { fly: () => console.log("Lendab"), layEggs: () => console.log("Muneb mune") };
const myFish: Fish = { swim: () => console.log("Ujub"), layEggs: () => console.log("Muneb mune") };
move(myBird); // Väljund: Lendab
move(myFish); // Väljund: Ujub
Kohandatud tüübivalvuri funktsioonid
Keerukamate stsenaariumide jaoks saate defineerida oma tüübivalvuri funktsioone. Need funktsioonid tagastavad tüübipredikaadi, mis on tõeväärtusavaldise, mida TypeScript kasutab muutuja tüübi kitsendamiseks. Tüübipredikaat on kujul muutuja on Tüüp
.
interface Square {
kind: "square";
size: number;
}
interface Circle {
kind: "circle";
radius: number;
}
type Shape = Square | Circle;
function isSquare(shape: Shape): shape is Square {
return shape.kind === "square";
}
function getArea(shape: Shape) {
if (isSquare(shape)) {
return shape.size * shape.size; // TypeScript teab, et 'shape' on siin Square
} else {
return Math.PI * shape.radius * shape.radius; // TypeScript teab, et 'shape' on siin Circle
}
}
const mySquare: Square = { kind: "square", size: 5 };
const myCircle: Circle = { kind: "circle", radius: 3 };
console.log(getArea(mySquare)); // Väljund: 25
console.log(getArea(myCircle)); // Väljund: 28.274333882308138
Mis on tüübikinnitused?
Tüübikinnitused on viis öelda TypeScripti kompilaatorile, et teate muutuja tüübi kohta rohkem, kui see hetkel mõistab. Need on viis TypeScripti tüübijärelduse ülekirjutamiseks ja väärtuse tüübi selgesõnaliseks määramiseks. Siiski on oluline kasutada tüübikinnitusi ettevaatlikult, kuna need võivad TypeScripti tüübikontrollist mööda minna ja valesti kasutamisel potentsiaalselt põhjustada käitusvigu.
Tüübikinnitustel on kaks vormi:
- Nurgaklambrite süntaks:
<Type>value
as
-võtmesõna:value as Type
as
-võtmesõna on üldiselt eelistatud, kuna see on JSX-iga paremini ühilduv.
Millal kasutada tüübikinnitusi
Tüübikinnitusi kasutatakse tavaliselt järgmistes stsenaariumides:
- Kui olete kindel muutuja tüübis, mida TypeScript ei suuda järeldada.
- Kui töötate koodiga, mis suhtleb JavaScripti teekidega, mis pole täielikult tüübitud.
- Kui peate teisendama väärtuse spetsiifilisemaks tüübiks.
Tüübikinnituste näited
Selgesõnaline tüübikinnitus
Selles näites kinnitame, et document.getElementById
-i kutse tagastab HTMLCanvasElement
-i. Ilma kinnituseta järeldaks TypeScript üldisema tüübi HTMLElement | null
.
const canvas = document.getElementById("myCanvas") as HTMLCanvasElement;
const ctx = canvas.getContext("2d"); // TypeScript teab, et 'canvas' on siin HTMLCanvasElement
if (ctx) {
ctx.fillStyle = "#FF0000";
ctx.fillRect(0, 0, 150, 75);
}
Tundmatute tüüpidega töötamine
Välisest allikast, näiteks API-st, pärinevate andmetega töötades võite saada andmeid tundmatu tüübiga. Saate kasutada tüübikinnitust, et öelda TypeScriptile, kuidas andmeid käsitleda.
interface User {
id: number;
name: string;
email: string;
}
async function fetchUser(id: number): Promise<User> {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
const data = await response.json();
return data as User; // Kinnita, et andmed on User tüüpi
}
fetchUser(1)
.then(user => {
console.log(user.name); // TypeScript teab, et 'user' on siin User
})
.catch(error => {
console.error("Viga kasutaja toomisel:", error);
});
Hoiatused tüübikinnituste kasutamisel
Tüübikinnitusi tuleks kasutada säästlikult ja ettevaatlikult. Tüübikinnituste liigne kasutamine võib varjata aluseks olevaid tüübivigu ja põhjustada käitusaegseid probleeme. Siin on mõned olulised kaalutlused:
- Vältige sundkinnitusi: Ärge kasutage tüübikinnitusi väärtuse sundimiseks tüüpi, mis see selgelt ei ole. See võib TypeScripti tüübikontrollist mööda minna ja põhjustada ootamatut käitumist.
- Eelistage tüübivalvureid: Võimaluse korral kasutage tüübikinnituste asemel tüübivalvureid. Tüübivalvurid pakuvad turvalisemat ja usaldusväärsemat viisi tüüpide kitsendamiseks.
- Valideerige andmeid: Kui kinnitate välisest allikast pärinevate andmete tüüpi, kaaluge andmete valideerimist skeemi alusel, et tagada nende vastavus oodatud tüübile.
Tüübi kitsendamine
Tüübivalvurid on lahutamatult seotud tüübi kitsendamise kontseptsiooniga. Tüübi kitsendamine on protsess, mille käigus täpsustatakse muutuja tüüp spetsiifilisemaks tüübiks, tuginedes käitusaegsetele tingimustele või kontrollidele. Tüübivalvurid on tööriistad, mida kasutame tüübi kitsendamise saavutamiseks.
TypeScript kasutab vooanalüüsi, et mõista, kuidas muutuja tüüp muutub erinevates koodiharudes. Kui kasutatakse tüübivalvurit, uuendab TypeScript oma sisemist arusaama muutuja tüübist, võimaldades teil ohutult kasutada sellele tüübile spetsiifilisi meetodeid ja omadusi.
Tüübi kitsendamise näide
function processValue(value: string | number | null) {
if (value === null) {
console.log("Väärtus on null");
} else if (typeof value === "string") {
console.log(value.toUpperCase()); // TypeScript teab, et 'value' on siin string
} else {
console.log(value.toFixed(2)); // TypeScript teab, et 'value' on siin number
}
}
processValue("test"); // Väljund: TEST
processValue(123.456); // Väljund: 123.46
processValue(null); // Väljund: Väärtus on null
Parimad praktikad
Et oma TypeScripti projektides tüübivalvureid ja tüübikinnitusi tõhusalt kasutada, kaaluge järgmisi parimaid praktikaid:
- Eelistage tüübivalvureid tüübikinnitustele: Tüübivalvurid pakuvad turvalisemat ja usaldusväärsemat viisi tüüpide kitsendamiseks. Kasutage tüübikinnitusi ainult vajadusel ja ettevaatlikult.
- Kasutage keerukate stsenaariumide jaoks kohandatud tüübivalvureid: Keeruliste tüübisuhete või kohandatud andmestruktuuridega tegelemisel defineerige oma tüübivalvuri funktsioonid, et parandada koodi selgust ja hooldatavust.
- Dokumenteerige tüübikinnitused: Kui kasutate tüübikinnitusi, lisage kommentaare, et selgitada, miks te neid kasutate ja miks usute, et kinnitus on ohutu.
- Valideerige väliseid andmeid: Välistest allikatest pärinevate andmetega töötades valideerige andmed skeemi alusel, et tagada nende vastavus oodatud tüübile. Selleks võivad olla abiks teegid nagu
zod
võiyup
. - Hoidke tüübimääratlused täpsed: Veenduge, et teie tüübimääratlused peegeldaksid täpselt teie andmete struktuuri. Ebatäpsed tüübimääratlused võivad viia valede tüübijärelduste ja käitusvigadeni.
- Lülitage sisse range režiim: Kasutage TypeScripti ranget režiimi (
strict: true
failistsconfig.json
), et lubada rangem tüübikontroll ja püüda potentsiaalsed vead varakult kinni.
Rahvusvahelised kaalutlused
Globaalsele publikule rakendusi arendades olge teadlik, kuidas tüübivalvurid ja tüübikinnitused võivad mõjutada lokaliseerimis- ja rahvusvahelistamis- (i18n) püüdlusi. Täpsemalt kaaluge järgmist:
- Andmete vormindamine: Numbri- ja kuupäevavormingud varieeruvad eri lokaatides märkimisväärselt. Numbri- või kuupäevaväärtustel tüübikontrolli või -kinnitusi tehes veenduge, et kasutate lokaaditeadlikke vormindamis- ja parsimisfunktsioone. Näiteks kasutage teeke nagu
Intl.NumberFormat
jaIntl.DateTimeFormat
numbrite ja kuupäevade vormindamiseks ja parsimiseks vastavalt kasutaja lokaadile. Konkreetse vormingu (nt USA kuupäevavorming KK/PP/AAAA) ebaõige eeldamine võib teistes lokaatides põhjustada vigu. - Valuuta käsitlemine: Valuutasümbolid ja vormindamine erinevad samuti globaalselt. Rahaliste väärtustega tegeledes kasutage teeke, mis toetavad valuuta vormindamist ja konverteerimist, ning vältige valuutasümbolite koodi sisse kirjutamist. Veenduge, et teie tüübivalvurid käsitleksid õigesti erinevaid valuutatüüpe ja hoiaksid ära valuutade juhusliku segamise.
- Märgikodeering: Olge teadlik märgikodeeringu probleemidest, eriti stringidega töötades. Veenduge, et teie kood käsitleks Unicode'i märke õigesti ja väldiks eeldusi märgistikute kohta. Kaaluge teekide kasutamist, mis pakuvad Unicode'i-teadlikke stringitöötlusfunktsioone.
- Paremalt vasakule (RTL) keeled: Kui teie rakendus toetab RTL-keeli nagu araabia või heebrea, veenduge, et teie tüübivalvurid ja -kinnitused käsitleksid teksti suunda õigesti. Pöörake tähelepanu sellele, kuidas RTL-tekst võib mõjutada stringide võrdlusi ja valideerimisi.
Kokkuvõte
Tüübivalvurid ja tüübikinnitused on olulised tööriistad tüübiohutuse parandamiseks ja robustsema TypeScripti koodi kirjutamiseks. Mõistes, kuidas neid funktsioone tõhusalt kasutada, saate vältida käitusvigu, parandada koodi hooldatavust ja luua usaldusväärsemaid rakendusi. Pidage meeles eelistada võimaluse korral tüübivalvureid tüübikinnitustele, dokumenteerida oma tüübikinnitused ja valideerida väliseid andmeid, et tagada oma tüübiteabe täpsus. Nende põhimõtete rakendamine võimaldab teil luua stabiilsemat ja prognoositavamat tarkvara, mis sobib globaalseks kasutuselevõtuks.