Ero sivun ”TypeScript” versioiden välillä
p typo |
|||
| Rivi 26: | Rivi 26: | ||
== TypeScriptin perusta == | == TypeScriptin perusta == | ||
TypeScript tuo staattisen tyypityksen ja muita suurten sovellusten kehittämiseen soveltuvia ominaisuuksia [[JavaScript]]in päälle. Se toimii Supersettinä JavaScriptille, eli jokainen validi JavaScript-koodi on myös validia TypeScript-koodia. Lopuksi se sitten transpiloituu tavalliseksi JavaScriptiksi, jota [[ | TypeScript tuo staattisen tyypityksen ja muita suurten sovellusten kehittämiseen soveltuvia ominaisuuksia [[JavaScript]]in päälle. Se toimii Supersettinä JavaScriptille, eli jokainen validi JavaScript-koodi on myös validia TypeScript-koodia. Lopuksi se sitten transpiloituu tavalliseksi JavaScriptiksi, jota [[Verkkoselaimet|selaimet]] ja [[Node.js]]-ympäristöt ymmärtävät. | ||
== Tyypityksen ero: TypeScript vs. JavaScript == | == Tyypityksen ero: TypeScript vs. JavaScript == | ||
Nykyinen versio 23. marraskuuta 2025 kello 19.12
| TypeScript | |
|---|---|
| Paradigma | Moniparadigmainen |
| Tyypitys | Vahva, staattinen |
| Evaluointitapa | Laiska ja innokas |
| Suoritusmalli | Käännetty (transpiloituu JavaScriptiksi), tulkattu ja ajonaikainen |
| Muistinhallinta | Automaattinen |
| Tekijä(t) | Anders Hejlsberg (Microsoft) |
| Kehittäjä(t) | Microsoft |
| Moottori | JavaScript-moottorit (esim. V8 (Chrome, Node.js), SpiderMonkey (Firefox)) |
| Ensijulkaisu | Lokakuu 2012 |
| Käyttöliittymä | Web-sovellukset, työpöytäsovellukset (Electron), mobiilisovellukset (React Native)) |
| Tyyppi | Transpiloituva kieli |
| Lisenssi | Apache-lisenssi v2.0 |
| Kotisivu | typescriptlang.org |
| Lähdekoodi | github.com/microsoft/TypeScript |
TypeScript on ohjelmointikieli, joka on suunniteltu erityisesti suurten JavaScript-sovellusten kehittämiseen. Se on Microsoftin kehittämä ja ylläpitämä, avoimen lähdekoodin kieli.
TypeScriptin perusta
[muokkaa]TypeScript tuo staattisen tyypityksen ja muita suurten sovellusten kehittämiseen soveltuvia ominaisuuksia JavaScriptin päälle. Se toimii Supersettinä JavaScriptille, eli jokainen validi JavaScript-koodi on myös validia TypeScript-koodia. Lopuksi se sitten transpiloituu tavalliseksi JavaScriptiksi, jota selaimet ja Node.js-ympäristöt ymmärtävät.
Tyypityksen ero: TypeScript vs. JavaScript
[muokkaa]Tyypityksen ero on merkittävin virheiden havaitsemisessa jo kehitysvaiheessa verrattuna virheiden havaitsemiseen vasta ohjelman suoritusvaiheessa (runtime).
1. Dynaaminen Tyypitys (JavaScript)
- JavaScript on dynaamisesti tyypitetty kieli. Muuttujien tyyppi tarkistetaan vasta suorituksen aikana.
- Tämä voi johtaa piileviin virheisiin ja odottamattomaan tyyppipakkokeinoon (Type Coercion).
2. Staattinen Tyypitys (TypeScript)
- TypeScript on staattisesti tyypitetty kieli. Muuttujien, funktioiden parametrien ja paluuarvojen tyypit tarkistetaan käännösaikana (compile-time).
- Varhainen virheen havainnointi: Jos yrität syöttää funktioon vääräntyyppisen arvon (esim. merkkijonon numeron sijaan), TypeScriptin kääntäjä antaa virheilmoituksen heti kehitysvaiheessa. Tämä estää monia runtime-virheitä.
3. Tyyppipäättely ja Merkinnät
- Valinnainen Tyyppimerkintä: Vaikka TypeScript on staattisesti tyypitetty, tyyppimerkinnät (: number, : string jne.) ovat usein valinnaisia.
- Tyyppipäättely (Type Inference): Useimmissa tapauksissa TypeScript on riittävän älykäs päättelemään muuttujan tyypin sen arvon perusteella, vähentäen manuaalisen tyypityksen tarvetta.
4. Rakenteellinen Tyypitys (Structural Typing)
- TypeScript käyttää rakenteellista tyypitystä (tunnetaan myös "duck typingina"), ei nimityypitystä. Tämä tarkoittaa, että tyyppien yhteensopivuus perustuu niiden rakenteeseen (eli niissä oleviin ominaisuuksiin ja metodeihin), ei niiden nimeen.
- Sääntö: Jos tyypillä on sama rakenne kuin toisella tyypillä (eli sillä on kaikki samat pakolliset ominaisuudet), se on yhteensopiva sen kanssa.
- Esimerkki: Jos sinulla on kaksi eri rajapintaa (interface), Henkilö ja Käyttäjä, mutta molemmilla on vain ominaisuus nimi: string, TypeScript pitää niitä yhteensopivina.
interface Henkilo {
nimi: string;
}
interface Kayttaja {
nimi: string;
}
// TS sallii tämän, koska rakenteet ovat samat:
const a: Henkilo = { nimi: "Aada" };
const b: Kayttaja = a; // OK! Vaikka tyyppien nimet ovat eri.
Rakenteellinen tyypitys tekee TypeScriptin koodista joustavampaa ja tukee paremmin JavaScriptin luontaista, löysempää tapaa käyttää objekteja.