Typescript – const assertion, dlaczego powinieneś to znać?

W Typescript 3.4 dostaliśmy feature zwanym „const assertions”, za pomocą którego możemy powiedzieć transpilatorowi coś w rodzaju: „twierdzę że zmienna jest stałą”. Wbrew pozorom jest to jedna z tych bardziej znaczących funkcji.

let title = ‚title’ as const; // … co jest równoznaczne z const title = ‚title’;

Po słowie kluczowym as nie „twierdzimy typu” tylko sposób jego definiowania. Ciekawiej zaczyna się kiedy użyjemy nowej funkcjonalności dla literału obiektowego:

const response = { meta: 'utf-8', data: 'hello', } as const; // jest równoznaczne z: const response = { readonly meta: 'utf-8', readonly data: 'hello', };

Nie muszę chyba mówić jak bardzo przydatny to feature gdy nie chcemy mutować literałów obiektowych. Warto też wspomnieć że skoro mamy tu do czynienia z readonly i const to w const assertion jest …

Brak Rozszerzania typów

Kiedy zadeklarujesz zmienną jako ciąg znaków lub liczbę, Typescript automatycznie wybierze typ: dla ciągu znaków string a dla liczby number.

Natomiast w przypadku gdy zadeklarujesz ciąg znaków lub liczbę jako stałą, mechanizm inferencji zadziała nieco inaczej – typem będzie wartość.

let first = 'title'; // posiadany typ: string const second = 'title'; // posiadany typ: 'title'

Skoro second jest stałą i nie można jej zmienić to naturalne jest to że posiada też typ literału. Teraz zobaczmy co się stanie kiedy wartość stałej przypiszemy do zmiennej!

const second = 'title'; // posiadany typ: 'title' let third = second; // posiadany typ: string

Co tu się stało? third jest zmienną więc inferencja ustawiła jej bardziej ogólny typ string.

Wracając do literałów obiektowych zaopatrzonych w klauzule as const oprócz tego że nie można zmienić wartości zmieniamy też typ wszystkich literałow zawrtych w tymże obiekcie! Mam nadzieję że świadomość tego pozwoli Ci w przyszłości rozwiązać problemy.

Jedna myśl w temacie “Typescript – const assertion, dlaczego powinieneś to znać?”

Dodaj komentarz

Twój adres email nie zostanie opublikowany.