Najlepsze praktyki dla pętli for w TypeScript
Ten artykuł wyjaśnia najlepsze praktyki dotyczące używania pętli for w TypeScript.
YouTube Video
Najlepsze praktyki dla pętli for w TypeScript
Instrukcje for
to podstawowa i potężna składnia służąca do wykonywania operacji powtarzalnych. W TypeScript korzystanie z kontroli typów i pisanie kodu z myślą o czytelności i utrzymaniu pozwala tworzyć wydajny kod z mniejszą liczbą błędów.
Wybór odpowiedniego typu pętli
TypeScript oferuje kilka konstrukcji pętli, z których każda nadaje się do różnych zastosowań. Wybór odpowiedniej pętli jest kluczowy dla przejrzystości kodu i wydajności.
Standardowa pętla for
1for (let i = 0; i < 10; i++) {
2 console.log(i);
3}
Standardowa pętla for
jest idealna, gdy potrzebujesz precyzyjnej kontroli nad indeksem iteracji.
Najlepsze praktyki
1const maxIterations = 10;
2for (let i = 0; i < maxIterations; i++) {
3 console.log(i);
4}
Pisząc instrukcje for
, pamiętanie o poniższych kwestiach pomoże pisać bezpieczniejszy i bardziej czytelny kod.
- Używaj
let
dla zmiennych indeksowych- Używanie
let
zamiastvar
ogranicza zakres do bloku, zapobiegając niezamierzonemu zachowaniu.
- Używanie
- Używaj stałych oraz opisowych nazw zmiennych, aby jasno określić granice pętli.
- Unikanie magicznych liczb oraz stosowanie znaczących nazw zmiennych zwiększa czytelność.
Pętla for...of
1const array = [1, 2, 3];
2for (let value of array) {
3 console.log(value);
4}
Pętla for...of
nadaje się do iteracji po iterowalnych obiektach, takich jak tablice i ciągi znaków.
Najlepsze praktyki
1const array = [1, 2, 3];
2for (const value of array) {
3 console.log(value);
4}
Pisząc pętle for...of
, zwrócenie uwagi na poniższe wskazówki może pomóc w pisaniu bezpieczniejszego kodu.
- Używaj
const
dla zmiennych pętli- Jeśli wartości w pętli nie są modyfikowane, używanie
const
zapobiega przypadkowemu przypisaniu nowej wartości.
- Jeśli wartości w pętli nie są modyfikowane, używanie
Pętla for...in
1const obj = { a: 1, b: 2, c: 3 };
2for (const key in obj) {
3 console.log(`${key}: ${obj[key]}`);
4}
Pętla for...in
iteruje po enumerowalnych właściwościach obiektu.
Najlepsze praktyki
1const obj = { a: 1, b: 2, c: 3 };
2for (const key in obj) {
3 if (obj.hasOwnProperty(key)) {
4 console.log(`${key}: ${obj[key]}`);
5 }
6}
Pisząc pętlę for...in
, możesz rozważyć następujące kwestie.
- Filtrowanie właściwości
- Jeśli chcesz uniknąć dziedziczonych właściwości, możesz użyć
hasOwnProperty
.
- Jeśli chcesz uniknąć dziedziczonych właściwości, możesz użyć
- Nie używaj
for...in
z tablicami. Unikaj używaniafor...in
z tablicami. Może iterować po wszystkich właściwościach wyliczalnych, w tym takich, które nie są indeksami tablicy.
Metoda forEach
1const array = [1, 2, 3];
2array.forEach((value, index) => {
3 console.log(`Index: ${index}, Value: ${value}`);
4});
Podczas iteracji po tablicach forEach
jest zwięzłe i eliminuje konieczność zarządzania indeksami.
Najlepsze praktyki
Korzystając z metody forEach
, możesz rozważyć następujące kwestie.
- Używaj funkcji strzałkowych
- Używaj zwięzłych funkcji strzałkowych, aby poprawić czytelność.
- Unikaj przerwań
forEach
nie obsługujebreak
anicontinue
. Używaj pętlifor...of
lubfor
, gdy jest to potrzebne:.
Bezpieczeństwo typów i zapobieganie błędom
Wykorzystując system typów TypeScript, można zapobiec błędom w czasie wykonywania podczas iteracji:.
Określ ścisłe typy dla zmiennych w pętli
1const items = [1, 2, 3];
2items.forEach(item => {
3 console.log(item * 2);
4});
1const items: number[] = [1, 2, 3];
2items.forEach((item: number) => {
3 console.log(item * 2);
4});
Wyraźne określanie typów zmiennych w pętli pozwala na wczesne wykrywanie niezgodności typów.
Unikaj niejawnego any
1{
2 "compilerOptions": {
3 "noImplicitAny": true
4 }
5}
Włączając opcję noImplicitAny
w pliku tsconfig.json
, możesz zapobiec przypisywaniu zmiennym bez jawnie określonych typów domyślnego typu any
.
Używaj ReadonlyArray
w razie potrzeby
1const numbers: ReadonlyArray<number> = [1, 2, 3];
2for (const value of numbers) {
3 console.log(value);
4}
Jeśli iterujesz po tablicy, która nie powinna być modyfikowana, możesz użyć ReadonlyArray
.
Uwagi dotyczące wydajności
Wydajność jest kluczowa dla pętli przetwarzających duże zestawy danych lub często wykonywanych pętli:.
Wybierz optymalną metodę implementacji pętli.
Istnieje wiele sposobów implementacji pętli, z różnicami w czytelności i wydajności wykonania.
1// Prepare input data (an array from 1 to 1000000)
2const input: number[] = Array.from({ length: 1000000 }, (_, i) => i + 1);
3
4// --- for ---
5console.time('for loop');
6const squaresFor: number[] = [];
7for (let i = 0; i < input.length; i++) {
8 squaresFor.push(input[i] * input[i]);
9}
10console.timeEnd('for loop');
11
12// --- while ---
13console.time('while loop');
14const squaresWhile: number[] = [];
15let i: number = 0;
16while (i < input.length) {
17 squaresWhile.push(input[i] * input[i]);
18 i++;
19}
20console.timeEnd('while loop');
21
22// --- for-of ---
23console.time('for-of loop');
24const squaresForOf: number[] = [];
25for (const num of input) {
26 squaresForOf.push(num * num);
27}
28console.timeEnd('for-of loop');
29
30// --- forEach ---
31console.time('forEach loop');
32const squaresForEach: number[] = [];
33input.forEach((num: number): void => {
34 squaresForEach.push(num * num);
35});
36console.timeEnd('forEach loop');
37
38// --- map ---
39console.time('map');
40const squaresMap: number[] = input.map((value: number): number => value * value);
41console.timeEnd('map');
Wydajność różni się w zależności od środowiska wykonawczego, ale na przykład przy uruchamianiu pętli milion razy różnica może być dość zauważalna. Wybierz optymalną metodę pętli, mając na uwadze łatwość utrzymania i wydajność.
Używaj natywnych metod iteracyjnych
1const squares = [1, 2, 3].map(value => value * value);
2console.log(squares);
3
4const numbers = [1, 2, 3, 4, 5, 6];
5const evenNumbers = numbers.filter(value => value % 2 === 0);
6console.log(evenNumbers); // [2, 4, 6]
7
8const squaredEvens = numbers
9 .filter(value => value % 2 === 0) // Keep only even numbers
10 .map(value => value * value); // Square the remaining values
11
12console.log(squaredEvens); // [4, 16, 36]
Metody takie jak map
i filter
mogą być bardziej czytelne w niektórych przypadkach.
Preferuj for...of
dla lepszej czytelności
Wydajność powinna być priorytetem tylko w ograniczonych przypadkach; zwykle ważniejsze jest pisanie czytelnego kodu. Na przykład priorytetowe traktowanie for...of
może poprawić czytelność.
1const fruits = ["apple", "banana", "cherry"];
2
3for (let i = 0; i < fruits.length; i++) {
4 console.log(`${i}: ${fruits[i]}`);
5}
Najlepsze praktyki
1const fruits = ["apple", "banana", "cherry"];
2
3for (const [index, fruit] of fruits.entries()) {
4 console.log(`${index}: ${fruit}`);
5}
Priorytetowe traktowanie pętli for...of
pozwala pisać kod bardziej czytelny i odporny na błędy. Jak pokazano w tym przykładzie, jeśli potrzebujesz również indeksów tablicy, skuteczne jest połączenie entries()
z for...of
.
Unikanie powszechnych pułapek
Modyfikowanie kolekcji podczas iteracji
1const array = [1, 2, 3];
2for (const value of [...array]) {
3 if (value === 2) {
4 array.push(4); // Avoid this!
5 }
6}
7console.log(array);
Modyfikowanie tablicy podczas iteracji może prowadzić do nieoczekiwanego zachowania:. W razie potrzeby użyj kopii.
Rozważ przypadki brzegowe
1const array: number[] = [];
2for (const value of array) {
3 console.log(value); // No output, but no errors
4}
Ten kod działa poprawnie, ale jeśli musisz obsłużyć puste tablice, możesz go poprawić w następujący sposób.
1const array: number[] = [];
2if (array.length === 0) {
3 console.log("The array is empty.");
4} else {
5 for (const value of array) {
6 console.log(value);
7 }
8}
Rozważenie przypadków brzegowych może pomóc w zapobieganiu błędom w dalszym kodzie.
Wnioski
Aby opanować instrukcję for
w TypeScript, kluczowe jest zrozumienie różnych konstrukcji pętli, stosowanie bezpiecznych typów i optymalizacja wydajności. Te najlepsze praktyki pomagają pisać czystszy, bardziej niezawodny i łatwiejszy w utrzymaniu kod.
Możesz śledzić ten artykuł, korzystając z Visual Studio Code na naszym kanale YouTube. Proszę również sprawdzić nasz kanał YouTube.