Co to jest TypeScript?

TypeScript

TypeScript jest językiem programowania (opracowanym przez Microsoft), który jest ścisłym nadzbiorem języka JavaScript, który dostarcza statyczne, czyli przed czasem wykonywania kodu (ang. runtime) sprawdzanie kodu JavaScript, włączając w to między innymi strukturalne (nie-nominalne) sprawdzanie typów, które dotyczy zmiannych, funkcji, klas i operacji, ale również dostarcza do JavaScript pewne nie-statyczne, czyli dostępne w trakcie wykonywania się kodu rozszerzenia, takie jak wyliczenia, inaczej enumy (ang. enums), dekoratory (ang. decorators), oraz przestrzenie nazw (ang. namespaces).

Początki TypeScript

JavaScript, do którego kompilowany jest TypeScript, jest uważany za programistyczny lingua franca współczesnego świata. JavaScript był przede wszystkich dedykowany elementarnym operacjom na dokumentach w przeglądarkach internetowych. Obecnie podpiera złożone aplikacje klienckie (ang. client-side) i serwerowe (ang. server-side).

Być może ze względu na swoją skomplikowaną ewolucję, a być może ze względu na decyzje architektoniczne, JavaScript nie zawiera rozwiązania silnego typowania dla swych wartości. TypeScript rozpoczął swoje życie jako próba zaadresowania tej kwestii, ale stał się potężnym systemem statycznego sprawdzania kodu JavaScript oraz nawet rozszerzania go o pewne elementy dostąpne w trakcie wykonywania tego kodu (ang. at runtime).

Jednymi z głównych architektów TypeScript był Anders Hejlsberg. Pierwsza publiczna wersja TypeScript oznaczona jako 0.8 pojawiła się w 2012 roku.

TypeScript jako ścisły nadzbiór JavaScript

Z perspektywy składniowej, TypeScript jest ścisłym nadzbiorem JavaScript, co oznacza, że wszelki kod JavaScript jest prawidłowym kodem TypeScript, ale nie każdy kod TypeScript jest prawidłowym kodem JavaScript.

// Prawidłowy kod TypeScript i prawidłowy kod JavaScript
var foo = 'bar'

function logBaz(baz) {
  console.log(baz)
}
// Prawidłowy kod Typescript, ale nieprawidłowy kod JavaScript
var foo: string = 'bar'

function logBaz(baz: any) {
  console.log(baz)
}

Anotacje typów, które obecne są w kodzie TypeScript, nie są dozwolone w kodzie JavaScript.

Statyczne sprawdzanie kodu w TypeScript

Jednym z głównych założeń w TypeScript jest, że sprawdzanie kodu jest statyczne, to znaczy, że ma miejsce przed czasem wykonywania tego kodu.

Co do zasady, kod TypeScript nie może być wykonywany przez środowiska wykonywania kodu JavaScript, takie jak przeglądarki, czy serwery Node. Wcześniej musi być skompilowany do czystego JavaScript. Podczas wykonywania kodu JavaScript żadne zdolności sprawdzania kodu przez TypeScript nie są już obecne.

TypeScript umożliwia statyczne sprawdzanie kodu w zakresie następujących obszarów:

Strukturalne Sprawdzanie Typów w TypeScript

Kolejnym kluczowym założeniem TypeScript, które należy zapamiętać, jest to, że sprawdzanie typów nieprymitywnych (ang. non-primitive) jest strukturalne, a nie nominalne.

Strukturalne (nie-nominalne) sprawdzanie typów

Strukturalne (nie-nominalne) sprawdzanie typów to ustalanie czy dany typ jest kompatybilny z innym typem poprzez porównywanie par kluczy i wartości (ang. properties) tych typów, a nie poprzez branie pod uwagę ich nazw lub sposobów deklaracji.

// W TypeScript klasy są zarówno wartościami, jak i typami.
class Dog {
  walk() { console.log('walking') }
}

class Cat {
  walk() { console.log('walking') }
}

const Pluto: Dog = new Cat() // Dozwolone, z perspektywy TypeScript.

Nie-statyczne rozszerzenia JavaScript w TypeScript

Jak już zauważono, żadne zdnolności sprawdzania typów przez TypeScript nie są obecne po kompilacji do JavaScript.

To nie oznacza, że cały kod TypeScript jest usuwany ze skompilowanego kodu JavaScript. Niektóre elementy TypeScript rozszerzają JavaScript o pewne dodatkowe zdolności. Jednakże, te elementy, po kompilacji, są wciąż wyrażone jako czysty kod JavaScript.

Elementy TypeScript, które niestatycznie rozszerzają JavaScript, to między innymi: