Blog

Wprowadzenie do Typscript: typy danych oraz funkcje

Kolejna odsłona ekspresowego kursu Typescript, którym będziemy wykorzystywać w przypadku tworzenie kodu w ramach Office Scripts dla Excel.

Wprowadzenie do Typscript: typy danych oraz funkcje

Zgodnie z obietnicą złożoną w ostatnim wpisie dzisiaj trochę o typach oraz sposobach manipulowania nimi. Plus dwa słowa na temat funkcji. Oczywiście na zakres i sposób prezentowanego materiału należy wziąć poprawkę w postaci służebnego celu tego wprowadzenia, ponieważ koncentruję się na tym, co może być przydatne w pracy z Office Scripts.

TYPY DANYCH

W przypadku Typescript (dalej TSC) do dyspozycji mamy wszystkie typy, które oferuje nam Javascript (dalej JS). Oczywiście kolejne kategorie typów zostały dołożone przez twórców tego pierwszego języka. Ja ze swojej strony nie będę wymieniał ich wszystkich, zwłaszcza że część z nich - jak chociażby symbol - jest mi zupełnie obca i z punktu widzenia przeciętnego użytkownika Office Scripts raczej nieszczególnie przydatna.

Natomiast w dzisiejszym wpisie do tematu typów chciałbym podejść w jeszcze węższym zakresie i tym samym skupić się na tak zwanych typach prostych lub jak ktoś woli prymitywnych, a tym samym tablice, krotki oraz pracę obiektami zostawię sobie na inną okazję.

Jeśli chodzi o typy proste to de facto możemy się ograniczyć do tych wylistowanych niżej:

Tak naprawdę w tym miejscu interesować nas będą trzy pierwsze, a o czwartej wspomnę przy okazji funkcji.

Jeśli chodzi boolean, to mamy tutaj do czynienia z typem logicznym, który może przyjmować “tylko” dwie wartości, czyli true i false (prawda i fałsz). Jest on zazwyczaj efektem wykorzystania różnych operatorów porównania i wykorzystywany w przypadku pętli czy instrukcji warunkowych, które omówimy w następnym wpisie.

Number służy do przedstawienia wartości liczbowej, przy czym w odróżnieniu od wielu innych języków w przypadku JS/TSC nie mam podziału na liczby całkowite i zmiennoprzecinkowe.

No i wreszcie string, który służy do przechowywania danych tekstowych czyli dowolnego łańcucha znaków  zakodowany w formacie Unicode. W celu przypisania do zmiennej tego rodzaju danych używa się apostrofów lub cudzysłowów, czyli na przykład:

let zmienna1: string = ‘tekst’

let zmienna2: string = “100”

Ważna jest jednak konsekwencja w tym zakresie, czyli jak używamy znaku apostrofu na początku, to całość zamykamy również apostrofem i tak samo jest z cudzysłowem.

OPERATORY

W tabeli niżej zebrane zostały operatory, dzięki którym możemy wykonywać różne operacje na danych. Pierwszy z nich jest już nam znany z pierwszego tekstu, ponieważ wprowadzony zostały przy okazji omawiania przypisania wartości do zmiennych.

Operatory

Opis

=

Przypisanie

==, !=

Równość, różność.

===, !==

Identyczność, nieidentyczność.

<, <=, >, >=

Mniejszy niż, mniejszy lub równy, większy niż, większy lub równy.

+, -, *, /, %

Dodawanie, odejmowanie, mnożenie, dzielenie, reszta z dzielenia.

&&, ||

Logiczne I, logiczne LUB 

++, --

Pre-/postinkrementacja, pre-/postdekrementacja.

Dwa kolejne wiersze w pewnym sensie robią to samo, czyli służą do porównywania dwóch wartości, przy czym ogólna sugestia jest taka, by raczej stosować ten drugi sposób, ponieważ wówczas sprawdzany jest również typ wartości. Dla przykładu, używając operatora równości "==", porównując liczbę 100 oraz ciąg znaków (string) "100" w efekcie otrzymamy wartość "true", ponieważ JS dokonuje w tym przypadku korekcji typów i liczba 100 staje się na ten moment ciągiem tekstowym. Niby drobiazg, ale w efekcie może doprowadzić to do nieoczekiwanych rezultatów.

Zwrócić chciałbym jeszcze na operator "+", który wykorzystywany bywa nie tylko do dodawania dwóch liczb, ale służy również do łączenia ciągów tekstowych. Tym samym jeśli między dwoma słowami, dajmy na tym "jeden" i "dwa" wstawimy symbol plusa w efekcie otrzymamy wartość "jedendwa".

Z tych istotnych warto zwrócić jeszcze uwagę na ostatni wiersz, ponieważ jest to operator często wykorzystywany przy okazji pętli, ale o tym wspomnę jeszcze w odpowiednim czasie.

FUNKCJE

Instrukcje w przypadku JS/TSC są wykonywane w kolejności ich występowania w skrypcie, czyli nasz kod przetwarzany jest po kolei od pierwszej linii do ostatniej. Jeśli chcemy uniknąć natychmiastowego wykonania jakiegoś jego fragmentu, możemy napisać go właśnie w ramach funkcji. Tak wprzódy przygotowany konstrukt zostanie “aktywowany” dopiero w momencie, gdy go w dalszej części skryptu wywołamy.

Rzecz jasna nie jest to jedyny czy nawet najważniejszy praktyczny przyczynek do tworzenie funkcji, ponieważ co najmniej równie istotna jest ich reużywalności, co znacząco upraszcza pisanie kodu. Innymi słowy: jeśli wiemy, że pewne działanie będzie wielokrotnie powielane w różnych częściach naszego programu, wówczas warto rozważyć możliwość zamknięcia go w ramach funkcji.

Innymi słowy: funkcja pozwala opakować sekwencję instrukcji w pewną jednostkę, którą można następnie wielokrotnie wywoływać z innego miejsca w programie. Tym sposobem pozwala na rozbicie większych i bardziej złożonych zadań na mniejsze elementy, które równie dobrze mogą zostać napisane przez różnych ludzi oddzielonych od siebie w czasie i przestrzeni.

Z tych wszystkich powodów można uznać funkcje jako kluczowe elementy każdego języka programowania, tym niemniej ich rola przy tworzenie skryptów dla Excela wydaje się ograniczona, przynajmniej jeśli mówimy o typowych zastosowaniach, gdzie faktycznie próbujemy automatyzować zadania, które dotychczas w arkuszu kalkulacyjnym wykonywaliśmy manualnie.

Korzystanie z funkcji - tak jak przy zmiennych - wymaga ich uprzedniej deklaracji, która w typowym przypadku składa się z nazwy funkcji oraz listy jej ewentualnych parametrów, a także - czy raczej przede wszystkim - z ciała funkcji, które ujęte jest w ramach nawiasów klamrowych.

function nazwaFunkcji (lista parametrów) {

//ciało funkcji, czyli nasz kod

}

Innym często spotykanym sposobem deklaracji jest przypisanie funkcji do jakiejś zmiennej czy stałej, a więc na przykład:

const nazwaFunkcji = function (lista parametrów) {

//ciało funkcji, czyli nasz kod

}

Jeśli chodzi o listę parametrów, to JS podchodzi do tej kwestii wyjątkowo liberalnie (jak praktycznie do wszystkiego innego), czyli bez względu czy w naszej definicji funkcji nie podaliśmy ani jednego parametru, czy wymieniliśmy ich dwie setki, to już przy samym wywołaniu funkcji w programie nie ma to większego znaczenia. Innymi słowy: kod się wykona niezależnie od tego, czy podana wówczas liczba argumentów będzie za mała czy za duża w stosunku do liczby oczekiwanych parametrów, choć rzecz jasna rezultat może być bardzo daleki od oczekiwanego.

Oczywiście są pewne mechanizmy mitygujące potencjalne ryzyko z tym związane jak chociażby możliwość przypisania wartości domyślnych dla konkretnego parametru czy tablice resztkowe, ale moim zdaniem to wciąż za mało. Natomiast używanie TSC bez wątpienie czyni funkcje zdecydowanie bardziej przewidywalnymi, ponieważ kompilator będzie oczekiwał tej samej liczby argumentów, co parametrów podanych w definicji funkcji. Więcej nawet: zgodność dotyczy nie tylko liczebności jednych i drugich, ale również ich identyczności, jeśli chodzi o typ, pod warunkiem, że w sposób jawny go określiliśmy inaczej kompilator TSC ustawia domyślnie typ any, czyli tak naprawdę dowolny (nie napiszę nieokreślony, bo w JS mamy coś takiego jak typ undefined).

Na zakończenie dzisiejszego wpisu wspominam o tym typie - zgodnie z obietnicą złożoną wcześniej - ponieważ w wielu miejscach spotkałem się z opinią, że korzystanie z any należy uznać za złą praktyką i jeśli to tylko możliwe, to unikać jego stosowania. Natomiast z całą pewnością należy mieć na uwadze, że używanie typu any przenosi na programistę odpowiedzialność za zagwarantowanie, że kod prawidłowo korzysta z typów, czyli dokładnie stawia go w sytuacji takiej jak w przypadku czystego kodu JS.