Tehnički članak

Zašto TypeScript nije samo JavaScript s tipovima

Strukturalna analiza koja ide dalje od surface-level usporedbi.

Uređivač koda s TypeScript sintaksom u azure i bijelim tonovima

Kad developeri koji dolaze iz strogo tipiziranih jezika poput Jave ili C# prvi put upoznaju TypeScript, reakcija je često iznenađenje — i ne uvijek pozitivno. TypeScript ne uvodi klase u JavaScript; one su već bile tu od ES6. Ne uvodi module; te su stigle ranije. Ono što TypeScript uvodi jest sustav tipova koji je strukturalan, a ne nominalan. U nominalnim sustavima, kakav koristi Java, dva tipa su ista samo ako nose isto ime ili ako jedan eksplicitno nasljeđuje drugi. U strukturalnom sustavu, kakav koristi TypeScript, dva tipa su kompatibilna ako dijele isti „oblik” — iste propertije s istim tipovima — bez obzira kako se zovu. Ova distinkcija nije detalj implementacije; ona mijenja kako dizajnirate sučelja između modula, kako testirate, i kako razmišljate o granama koda koje TypeScript smatra „mrtv im”. Štoviše, TypeScript-ov tip-sustav je Turing-kompletan, što znači da možete pisati programe koji se izvršavaju isključivo na razini tipova — bez ijedne linije runtime koda. To je moćan alat, ali i izvor konfuzije kad netko tek prelazi s Jave.

Praktične posljedice strukturalnog tipiziranja vidljive su čim počnete raditi s vanjskim API-jima. U Javi biste definirali interface i eksplicitno implementirali njega; u TypeScriptu, svaki objekt koji „izgleda” kao taj interface automatski zadovoljava kontrakt. Ovo olakšava testiranje — možete ubaciti mock objekt koji ima samo metode koje testirana funkcija zaista poziva, bez potrebe za punim implementiranjem sučelja. Ali ista ta fleksibilnost znači da prepisat i kod u JavaScript bez TypeScripta neće otkriti greške na koje ste naviknuli. Tip-sustav ne postoji u runtimeu; on nestaje kompilacijom. Developeri koji zaborave ovaj detalj znaju ostati začuđeni kad runtime baci grešku na nešto što je TypeScript „odobrio”. Razlog je uvijek isti: pretpostavka da tip-anotacije mijenjaju ponašanje programa, dok one samo opisuju očekivanja. Upravo zbog toga, TypeScript treba čitati kao jezik koji dokumentira namjeru — a ne kao jezik koji jamči ispravnost u runtimeu.