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.
Infrastruktura jako kod (terraform + digital ocean)
We wpisie pokazuję w jaki sposób rozstawić serwery z linii poleceń terraform.
Daniel Gustaw
• 3 min read
Publikacja aktualizacji paczki w repozytorium AUR
Naucz się jak publikować aktualizację pakietów w repozytorium użytkowników Arch Linux.
Daniel Gustaw
• 3 min read
Scraping WordPress - 4300 wyroków sądów w sprawach frankowych bez linii kodu
Nie często się zdarza, żeby wykonanie usługi trwało której, niż jej wycenienie, ale przy scrapingu może się tak stać. Zobacz jak łatwe może być pobranie danych, szczególnie z Wordpressa.
Daniel Gustaw
• 2 min read