Przeciążone sygnatury w TypeScript
W TypeScript możemy określić funkcję, która może być wywoływana na różne sposoby, pisząc sygnatury przeciążenia. Można to wykorzystać do definiowania funkcji, których typ zwracany zależy od wartości argumentów.
Daniel Gustaw
• 2 min read
Kiedy masz funkcję, która zwraca różne typy w zależności od wartości parametrów, overload signatures
mogą być dokładnie tym, czego potrzebujesz.
Pozwól, że przedstawię kontekst.
Mamy super prostą funkcję, która oblicza objętość hipersześcianu:
interface HyperCube {
size: number
dimension: number
}
export function volume(cube: HyperCube): number {
return Math.pow(cube.size, cube.dimension);
}
Ale ponieważ nasze wolumeny są naprawdę ogromne, musimy je wyświetlać w notacji snake case. Na przykład: 1_000_000_000
zamiast 1000000000
.
Możemy dodać funkcję do formatowania.
export function formatNumber(num: number): string {
return num.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1_')
}
ale nie chcemy zawsze pisać tej funkcji formatNumber
podczas konwersji do string. Zamiast tego chcielibyśmy dodać drugi parametr do funkcji volume
, aby zdecydować, czy zwracamy string, czy liczbę.
export function volume(cube: HyperCube, asString: boolean = false): string | number {
const volume = Math.pow(cube.size, cube.dimension);
return asString ? formatNumber(volume) : volume;
}
Niestety, obecnie korzystając z funkcji volume
, nie wiemy, czy otrzymamy string
czy number
. Nie chcemy korzystać z .toString
ani parseInt
w żadnym przypadku.
Na szczęście istnieje koncepcja zwana sygnaturami przeciążenia. Umożliwia ona wybór typu zwracanego w zależności od wartości parametrów.
W naszym przypadku chcemy, aby number
był, gdy asString
jest false, w przeciwnym razie potrzebujemy zwrócić string
. Aby zastosować sygnaturę przeciążenia, możemy użyć następującej składni:
export function volume(cube: HyperCube, asString: false): number
export function volume(cube: HyperCube, asString: true): string
export function volume(cube: HyperCube, asString: boolean = false): string | number {
const volume = Math.pow(cube.size, cube.dimension);
return asString ? formatNumber(volume) : volume;
}
teraz nasz typ zwracany jest poprawny i zależy od wartości asString
.
Źródła:
Typ zwracany funkcji TypeScript w oparciu o parametr wejściowy
Other articles
You can find interesting also.
Jak zainstalować Yay na czystym obrazie Dockera Arch Linux
Instalacja yay wymaga kilku kroków, takich jak tworzenie użytkownika, instalacja base-devel i git, zmiana w /etc/sudoers, klonowanie repozytorium yay i uruchomienie makepkg na nim. Ten post opisuje ten proces krok po kroku.
Daniel Gustaw
• 3 min read
Implementacja Rust RFC 7396 - Łatka JSON Merge
Prędkość i niezawodność Rust sprawiają, że jest idealny do implementacji JSON Merge Patch, zgodnie z definicją w RFC 7396. Ta specyfikacja umożliwia efektywne i bezpieczne częściowe aktualizacje dokumentów JSON.
Daniel Gustaw
• 10 min read
Ile rodzin zmieści się w samolocie - zadanie z algorytmiki
Porównujemy dwa rozwiązania zadania polegającego na zliczaniu wolnych zestawów przyległych miejsc. Dowiesz się jak używać Profilowania i jak wielką różnicę robi użycie pop oraz shift na tablicach w js.
Daniel Gustaw
• 12 min read