Kolejne lekcje wprowadzające do TypeScript. Na razie dopiero się rozkręcamy, ale musimy przez ten początkowy, nudny materiał się przebić. Teraz – tablice, tuple.
Ok, przykład z użyciem nawiasów ostrych:
let fruits: Array<string>;
fruits = ['Apple', 'Orange', 'Banana'];
let ids: Array<number>;
ids = [23, 34, 100, 124, 44];
A teraz bardziej normalne (moim zdaniem) podejście:
let fruits: string[] = ['Apple', 'Orange', 'Banana'];
Jak byśmy chcieli coś o indeksie poza zakresem (np. 3 w tym wypadku) to mamy undefined jak w czystym JS (to swoją drogą ciekawe i możemy zauważyć, że w JS nie mamy index out of range error czy czegoś takiego).
Ok, a teraz tablica, która jest readonly:
const names: Readonly<string[]> = ['John', 'Jane'];
//names.push('Jim');
//names.pop();
Kiedyś było niby coś takiego jak ReadonlyArray, ale to, co powyżej działa i nie potrzebuje dodatkowych typów. Swoją drogą jak nie mamy w tsconfig noemitonerrors na true to kod się skompiluje (choć error wyskoczy) i będziemy mieli to w JS wykonane, tylko edytor będzie zaznaczać błąd.
Ok, teraz tablica nie jako zmienna, ale argumenty przekazywane do funkcji:
const addMany = (...numbers: number[]):number => {
return numbers.reduce((curResult, curValue) => {
return curResult + curValue;
}, 0);
};
const addedNumbers = addMany(5, 10, 2, 3.7);
console.log(addedNumbers);
Po kompilacji mamy to:
"use strict";
const addMany = (...numbers) => {
return numbers.reduce((curResult, curValue) => {
return curResult + curValue;
}, 0);
};
const addedNumbers = addMany(5, 10, 2, 3.7);
console.log(addedNumbers);
A tu przykład typu any:
const logMany = (...args: any[]): void => {
args.forEach(arg => console.log(arg));
};
logMany('abc', 1, 2, 3, '4');
Any pozwala na łączenie typów. Możemy to nieco zawęzić do jakichś określonych typów:
const logMany2 = (...args: (number|string)[]): void => {
args.forEach(arg => console.log(arg));
};
logMany2('abc', 1, 2, 3, '4');
Pamiętać cały czas musimy, że po kompilacji to jedno i to samo:
const logMany = (...args) => {
args.forEach(arg => console.log(arg));
};
logMany('abc', 1, 2, 3, '4');
const logMany2 = (...args) => {
args.forEach(arg => console.log(arg));
};
logMany2('abc', 1, 2, 3, '4');
I teraz tak – any bądź typy z tą unią (tą kreską) pozwalają na mieszanie typów. To nie to samo, co powiedzenie – typ dowolny, ale ten sam typ w każdym elemencie.
Aby tak zawęzić, czyli typ dowolny, ale ten sam, musimy użyć typów generycznych:
function arrayEl<T>(...args: T[]): void {
args.forEach(arg => console.log(arg));
}
arrayEl<number>(1,2,3);
I teraz typ dowolny (ten typ, który wpisaliśmy do nawiasów ostrych), ale jeden i ten sam dla wszystkich elementów. Typy generyczne też niedługo sobie poznamy, na razie robimy taki TS 101 tylko.
Mamy też taki typ jak tupla, jeżeli ogarniamy tuple w Pythonie to musimy zapamiętać, te w TS są mutowalne. Natomiast koncepcja jest taka, że jest tablica określonej wielkości i określonych typów:
var employee: [number, string] = [1, "Steve"];
var person: [number, string, boolean] = [1, "Steve", true];
Możemy też mieć tuple array:
var employee: [number, string][];
employee = [[1, "Steve"], [2, "Bill"], [3, "Jeff"]];
Więcej TS już niedługo.