Lekcje modułu (2/2)
Deklaracje i Merging
Pliki deklaracji typów (z rozszerzeniem .d.ts) są używane w TypeScript do opisywania struktury istniejącego kodu JavaScript bez implementowania jakiejkolwiek rzeczywistej logiki. Zawierają one jedynie definicje typów, interfejsów i sygnatur funkcji.
Pliki te są kluczowe, gdy korzystamy z bibliotek zewnętrznych napisanych w czystym JavaScript.
Declaration Merging (Scalanie Deklaracji)
Declaration Merging to zachowanie, w którym kompilator łączy dwie lub więcej osobnych definicji o tej samej nazwie w jedną definicję.
Najczęstszym przypadkiem jest scalanie interfejsów:
interface User {
name: string;
}
interface User {
age: number;
}
// Wynikowy interfejs User posiada zarówno właściwość name, jak i age!
const student: User = {
name: 'Alice',
age: 23,
};Jeśli właściwości mają tę samą nazwę, muszą być tego samego typu, w przeciwnym razie TypeScript zgłosi błąd.
Modyfikowanie modułów globalnych i zewnętrznych
Możemy użyć scalania deklaracji (declaration merging) do rozszerzenia interfejsów zdefiniowanych w innych modułach lub w zakresie globalnym.
Na przykład, jeśli chcemy dodać właściwość do globalnego obiektu window w przeglądarce:
declare global {
interface Window {
analyticsToken: string;
}
}Używając declare global, informujemy TypeScript, że wstawiamy nową sygnaturę do interfejsu Window istniejącego już w zakresie globalnym.
Spróbuj sam
Ćwiczenie 1: Podstawowe scalanie deklaracji
W TypeScript interfejsy o tej samej nazwie w tym samym zakresie są automatycznie scalane. Zadeklaruj interfejs User z właściwością name: string, a następnie w drugim bloku zadeklaruj ten sam interfejs User dodając właściwość age: number. Na koniec zadeklaruj stałą user typu User z odpowiednimi wartościami.
Pokaż wskazówkę
Zadeklaruj interface User dwukrotnie, wprowadzając odpowiednie właściwości, a następnie przypisz te pola do obiektu user.
Rozwiązanie dostępne po 3 próbach
Ćwiczenie 2: Rozszerzanie globalnego interfejsu Window
Wyobraź sobie, że chcesz rozszerzyć globalny interfejs Window, aby dodać do niego niestandardową właściwość o nazwie config typu Record<string, string>. Napisz poprawną deklarację używając declare global, aby scalić nową właściwość z globalnym interfejsem Window.
Pokaż wskazówkę
Użyj declare global { interface Window { config: Record<string, string>; } }.
Rozwiązanie dostępne po 3 próbach