Hva er typescript, og hvorfor skulle jeg bruke det i stedet for Javascript?

stemmer
1k

Kan du beskrive hva Loggfila språket er?

Hva kan det gjøre at Javascript eller tilgjengelige bibliotekene ikke kan gjøre, som ville gi meg grunn til å vurdere det?

Publisert på 02/10/2012 klokken 16:37
kilden bruker
På andre språk...                            


5 svar

stemmer
1k

Jeg opprinnelig skrev dette svaret når Loggfila var fortsatt hot-off-the-presser. Fem år senere, er dette en OK oversikt, men se på Lodewijk svar nedenfor for mer dybde

1000ft utsikt ...

Maskinskrevet manuskript er et supersett av Javascript som først og fremst gir valgfrie statiske skrive, klasser og grensesnitt. En av de store fordelene er å aktivere IDE å gi et rikere miljø for å fange opp vanlige feil mens du skriver koden .

For å få en idé om hva jeg mener, se Microsofts introduksjonsvideo på språket.

For en stor Javascript prosjekt, kan vedta Loggfila resultere i mer robust programvare, samtidig som deployerbare der en vanlig Java programmet ville kjøre.

Det er åpen kildekode, men du får bare den smarte IntelliSense mens du skriver hvis du bruker en støttet IDE. I utgangspunktet var dette bare Microsofts Visual Studio (også bemerket i blogginnlegg fra Miguel de Icaza ). Disse dager, andre IDE tilby Loggfila støtte også .

Er det andre teknologier som det?

Det er CoffeeScript , men som virkelig tjener et annet formål. IMHO, gir CoffeeScript lesbarhet for mennesker, men Loggfila gir også dypt lesbarhet for verktøy gjennom sin valgfrie statisk typing (se denne siste blogginnlegg for litt mer kritikk). Det finnes også dart , men det er en full på erstatning for Javascript (selv om det kan produsere Javascript-kode )

Eksempel

Som et eksempel, her er noen Loggfila (du kan spille med dette i Loggfila Playground )

class Greeter {
    greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}  

Og her er Java det ville produsere

var Greeter = (function () {
    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + this.greeting;
    };
    return Greeter;
})();

Legg merke til hvordan den maskinskrevet manuskript definerer den type av medlemsvariable og klasse metode parametere. Dette fjernes ved omregning til Javascript, men brukes av IDE og kompilator for å oppdage feil, som passerer en numerisk type til konstruktøren.

Det er også i stand til å utlede typer som ikke er uttrykkelig vises til, for eksempel, ville det avgjøre greet()metoden returnerer en streng.

debugging Loggfila

Mange nettlesere og IDE med direkte debugging støtte gjennom sourcemaps. Se denne Stack Overflow spørsmålet for mer informasjon: Debugging Loggfila kode med Visual Studio

Vil du vite mer?

Jeg opprinnelig skrev dette svaret når Loggfila var fortsatt hot-off-the-presser. Sjekk ut Lodewijk svar på dette spørsmålet for noen mer aktuelle detaljer.

Svarte 02/10/2012 kl. 16:41
kilden bruker

stemmer
745

Selv om den aksepterte svaret er fint, følte jeg det egentlig ikke gjør Loggfila rettferdighet på dette punktet. Det er ikke de tidlige dager lenger. Loggfila er å finne mye mer adopsjon nå med flere populære rammer blir skrevet i typescript. Grunnene til at du bør velge Loggfila stedet for Javascript er mange nå.

Forholdet til Javascript

Javascript er standardisert gjennom ECMAScript standardene. Ikke alle nettlesere i bruk alle funksjonene til nyere ECMAScript standarder (se denne tabellen ). Loggfila støtter nye ECMAScript standarder og kompilerer dem til (eldre) ECMAScript mål som du selv velger (nåværende mål er 3, 5 og 6 [aka 2015]). Dette betyr at du kan bruke funksjonene i ES2015 og utover, som moduler, lambda funksjoner, klasser, spredning operatør, omstrukturering, i dag. Den legger også skrive støtte selvfølgelig, som ikke er del av noen ECMAScript-standarden og kan trolig aldri skyldes tolket naturen i stedet for samlet karakter av Javascript. Den type system av maskinskrevet manuskript er forholdsvis rik og omfatter: grensesnitt, enums, hybridtyper, generisk, union og krysstyper, adkomstmodifiseringsmidler og mye mer. Den offisielle nettsiden til Loggfila gir en oversikt over disse funksjonene.

Forholdet til andre Javascript rettet språk

Loggfila har en unik filosofi i forhold til andre språk som kompilere til Javascript. Javascript-koden er gyldig typescript kode; Loggfila er et supersett av Javascript. Du kan nesten endre navn på .jsfiler til .tsfiler og begynne å bruke Loggfila (se "Javascript interoperabilitet" nedenfor). Loggfila filer blir kompilert til lesbar Javascript, slik at migrasjon tilbake er mulig og forstå samlet Loggfila er ikke vanskelig i det hele tatt. Loggfila bygger videre på suksessen med Javascript mens bedre på sine svakheter.

På den ene siden har du fremtidige bevis verktøy som tar moderne ECMAScript standarder og kompilere den ned til eldre Javascript versjoner med Babel å være den mest populære. På den andre siden har du språk som kan helt forskjellig fra Javascript som mål Javascript, som Coffeescript, Clojure, Dart, Elm, Haxe, ScalaJs, og en hel rekke mer (se denne listen ). Disse språkene, selv om de kan være bedre enn der Java fremtid gang kan føre, kjøre en større risiko for ikke å finne nok adopsjon for deres framtid å være garantert. Du kan også ha mer problemer med å finne erfarne utviklere for noen av disse språkene, men de du finner kan ofte være mer entusiastiske. Samarbeid med Javascript kan også være litt mer involvert, siden de er lenger fjernet fra hva Javascript faktisk er.

Maskinskrevet manuskript ligger i mellom disse to ytterpunktene, og dermed å balansere risiko. Loggfila er ikke et risikabelt valg av noen standard. Det tar svært liten innsats for å venne seg til hvis du er kjent med Javascript, siden det ikke er et helt annet språk, har utmerket Java interoperabilitet støtte, og det har sett mye av adopsjon nylig.

Eventuelt statiske typing og type slutning

Javascript er dynamisk skrevet. Dette betyr at Javascript ikke vet hvilken type en variabel er før det er faktisk startes ved kjøring. Dette betyr også at det kan være for sent. Loggfila legger skriver støtte til Javascript. Feil som er forårsaket av falske forutsetninger av noen variable være av en viss type kan være helt utryddet hvis du spiller kortene dine riktig (hvor streng du skriver koden din, eller hvis du skriver koden din i det hele tatt er opp til deg).

Loggfila gjør skrive litt enklere og mye mindre eksplisitt ved bruk av type slutning. For eksempel: var x = "hello"i Loggfila er det samme som var x : string = "hello". Typen er ganske enkelt utledes fra bruken. Selv det du ikke eksplisitt skriver typene, er de fortsatt der for å redde deg fra å gjøre noe som ellers ville resultere i en kjøretidsfeil.

Loggfila eventuelt er skrevet som standard. For eksempel function divideByTwo(x) { return x / 2 }er en gyldig funksjon i Loggfila som kan kalles med noen form for parameteren, selv om kaller det med en streng vil åpenbart føre til en runtime error. Akkurat som du er vant til i Javascript. Dette fungerer, fordi når ingen type eksplisitt tildelt og type kan ikke utledes, som i divideByTwo eksempel vil Loggfila implisitt tildele type any. Dette betyr at divideByTwo funksjonstype underskrift blir automatisk function divideByTwo(x : any) : any. Det er en kompilator flagg for å forby dette problemet: --noImplicitAny. Aktivering av dette flagget gir deg en større grad av sikkerhet, men betyr også at du blir nødt til å gjøre mer å skrive.

Typer har en kostnad forbundet med dem. Først av alt det er en læringskurve, og andre av alt, selvfølgelig, vil det koste deg litt mer tid til å sette opp en kodebase ved hjelp av riktig streng skrive også. I min erfaring, disse kostnadene er helt verdt det på noen alvorlige kodebasen du deler med andre. En Large Scale studie av programmeringsspråk og kodekvalitet i Github tyder på at "at statisk skrevet språk generelt er mindre feil utsatt enn de dynamiske typer, og at sterke skrive er bedre enn svak typing i samme forhold".

Det er interessant å merke seg at denne samme papiret finner at Loggfila er mindre feil utsatt da Javascript:

For de med positive koeffisienter kan vi forvente at språket er assosiert med, alt annet likt, et større antall feilrettinger. Disse språkene inkluderer C, C ++, Javascript , Objective-C, PHP og Python. Språkene Clojure, Haskell, Ruby, Scala, og typescript , alle har negative koeffisienter antyde at disse språkene er mindre sannsynlig enn gjennomsnittet til å resultere i feil innfesting forplikter.

Enhanced IDE støtte

Utviklingen erfaring med Loggfila er en stor forbedring over Javascript. IDE er informert i sanntid av Loggfila kompilatoren på sin rike typen informasjon. Dette gir et par store fordeler. For eksempel med Loggfila kan du trygt gjøre refactorings som Endrer navn over hele kodebasen. Gjennom kodefullføring kan du få inline hjelp på hvilke funksjoner et bibliotek kan tilby. Ingen flere trenger å huske dem eller slå dem opp i online referanser. Compilation feil rapporteres direkte i IDE med en rød snirklete linje mens du er opptatt koding. Alt i alt dette gir en betydelig gevinst i produktivitet i forhold til å jobbe med Javascript. Man kan bruke mer tid på koding og mindre tid debugging.

Det er et bredt spekter av IDE som har utmerket støtte for maskinskrevet manuskript, som Visual Studio & VS kode, Atom, Sublime, og IntelliJ / WebStorm.

Strenge null kontroll

Runtime feil i skjemaet cannot read property 'x' of undefinedeller undefined is not a functioner svært ofte forårsaket av feil i Javascript-kode. Ut av boksen maskinskrevet manuskript allerede reduserer sannsynligheten for at slike feil som oppstår, ettersom man ikke kan bruke en variabel som ikke er kjent for maskinskrevet manuskript kompilatoren (med unntak av egenskapene til anyvariable maskinskrevne). Det er fortsatt mulig om å feilaktig bruke en variabel som er satt til undefined. Men med 2.0-versjonen av Loggfila kan du eliminere slike feil alle sammen gjennom bruk av ikke kan nullstilles typer. Dette fungerer på følgende måte:

Med strenge null sjekker aktivert ( --strictNullCheckskompilator flagg) Loggfila kompilatoren vil ikke tillate undefinedå bli tildelt en variabel med mindre du eksplisitt erklærer det å være av nullverdier type. For eksempel, let x : number = undefinedvil resultere i en kompileringsfeil. Dette passer perfekt med typeteori, siden undefineder ikke et tall. Man kan definere xsom en sum type numberog undefinedå rette opp dette: let x : number | undefined = undefined.

Når en type som er kjent for å kunne ha nullverdier, noe som betyr at det er av en type som også kan være av verdi nulleller undefined, den maskinskrevet manuskript Kompilatoren kan bestemme gjennom kontrollflyt basert typen analyse hvorvidt koden kan trygt bruke en variabel eller ikke. Med andre ord når du sjekker en variabel er undefinedgjennom for eksempel en ifuttalelse Loggfila kompilatoren vil antyde at typen i den grenen av koden kontroll flyt er ikke lenger ha nullverdier og kan derfor trygt brukes. Her er et enkelt eksempel:

let x: number | undefined;
if (x !== undefined) x += 1; // this line will compile, because x is checked.
x += 1; // this line will fail compilation, because x might be undefined.

Under oppbyggingen 2016 konferansen co-designer av Loggfila Anders Hejlsberg ga en detaljert forklaring og demonstrasjon av denne funksjonen: video (fra 44:30 til 56:30).

Compilation

For å bruke Loggfila du trenger en bygge prosess for å kompilere til Javascript-kode. Bygge prosessen tar vanligvis bare et par sekunder, avhengig selvfølgelig av størrelsen på prosjektet. Den maskinskrevet manuskript kompilatoren støtter inkrementell sammenstilling ( --watchkompilator flagg), slik at alle etterfølgende endringer kan være sammensatt med høyere hastighet.

Loggfila kompilatoren kan inline kilde kartinformasjon i den genererte JS-filer eller opprette separate .map filer. Kilde kartinformasjon kan brukes av debugging verktøy som Chrome DevTools og andre IDE å forholde linjene i Javascript for å de som genererte dem i Loggfila. Dette gjør det mulig for deg å sette stoppunkter og kontrollere variabler under kjøring direkte på typescript-kode. Kilde kartinformasjon fungerer ganske bra, det var rundt lenge før maskinskrevet manuskript, men debugging Loggfila er vanligvis ikke så stor som ved bruk av Javascript direkte. Ta thissøkeordet for eksempel. På grunn av de endrede semantikk av thissøkeordet rundt nedleggelser siden ES2015, thiskan faktisk eksisterer under kjøring som en variabel som heter _this(se dette svaret ). Dette kan forvirre deg under debugging, men generelt er ikke et problem hvis du vet om det eller inspisere Javascript-kode. Det bør bemerkes at Babel lider nøyaktig samme type problem.

Det er et par andre triks Loggfila kompilatoren kan gjøre, som genererer avskjære kode basert på dekoratører , genererer modulen lasting kode for ulike modulsystemer og analyse jsx . Men du vil trolig kreve en bygge verktøy i tillegg til Loggfila kompilatoren. For eksempel hvis du ønsker å komprimere koden må du legge til andre verktøy til byggeprosessen å gjøre det.

Det er Loggfila kompilering plugins tilgjengelig for Webpack , Gulp , Grunt og ganske mye annen Java bygge verktøy der ute. Loggfila dokumentasjon har en del på å integrere med bygge verktøy som dekker dem alle. En linter er også tilgjengelig i tilfelle du ønsker enda mer å bygge tid å sjekke. Det finnes også et stort antall frø prosjekter der ute som vil få deg i gang med typescript i kombinasjon med en haug med andre teknologier som Hjørne 2, reagere, Ember, SystemJs, WebPack, Gulp, etc.

interoperabilitet Java

Siden Loggfila er så nært knyttet til Java det har stor interoperabilitet evner, men litt ekstra arbeid er nødvendig for å arbeide med Javascript-biblioteker i Loggfila. Loggfila definisjoner er nødvendig slik at Loggfila kompilatoren forstår at funksjonskall som _.groupByeller angular.copyeller $.fadeOutikke er faktisk ulovlig uttalelser. Definisjonene for disse funksjonene er plassert i .d.tsfiler.

Den enkleste form en definisjon kan utføre er å tillate en identifikator som skal brukes i en hvilken som helst måte. For eksempel, når du bruker Lodash , en definisjon fil enkelt linje declare var _ : anyvil tillate deg å ringe noen funksjon du vil ha på _, men da selvfølgelig du er også fortsatt i stand til å gjøre feil: _.foobar()ville være en juridisk Loggfila samtale, men er selvfølgelig en ulovlig samtale ved kjøring. Hvis du vil ha riktig type støtte og kodefullføring din definisjon filen må være mer nøyaktig (se lodash definisjoner for et eksempel).

NPM-moduler som er forhåndspakket sammen med sin egen type definisjoner er automatisk forstått av maskinskrevet manuskript kompilatoren (se dokumentasjon ). For stort sett alle andre semi-populære Javascript-bibliotek som ikke inneholder sin egen definisjoner noen der ute allerede har gjort typedefinisjoner er tilgjengelige gjennom en annen NPM modul. Disse modulene er prefiks "@ typer /", og kommer fra et depot Github kalt DefinitelyTyped .

Det er en påminnelse: typedefinisjoner må samsvare med den versjonen av biblioteket du bruker ved kjøring. Hvis de ikke gjør det, kan Loggfila forby deg fra å kalle en funksjon eller dereferencing en variabel som eksisterer eller at du ringer en funksjon eller deferanseoperasjon en variabel som ikke eksisterer, rett og slett fordi de typene ikke samsvarer med run-time ved kompilering-tid . Så sørg for at du laster riktig versjon av typedefinisjoner for riktig versjon av biblioteket du bruker.

For å være ærlig, det er en liten problemfri til dette, og det kan være en av grunnene til at du ikke velger maskinskrevet manuskript, men i stedet gå for noe som Babel som ikke lider av å måtte få typedefinisjoner i det hele tatt. På den annen side, hvis du vet hva du gjør kan du enkelt overvinne noen form for problemer forårsaket av feil eller mangler definisjonsfiler.

Konvertering fra Javascript for å Loggfila

Enhver .jsfil kan bli omdøpt til en .tsog kjørte gjennom Loggfila kompilatoren å få syntaktisk samme Javascript-kode som en utgang (hvis det var syntaktisk riktig i første omgang). Selv når Loggfila kompilatoren blir kompilering feil vil det fortsatt produsere en .jsfil. Det kan også ta imot .jsfiler som input med --allowJsflagget. Dette gjør at du kan starte med typescript gang. Dessverre kompilering feil er sannsynlig i begynnelsen. Man trenger å huske at disse ikke er show-stopper feil som du kanskje er vant til med andre kompilatorer.

De kompilering feil man får i begynnelsen når du konverterer en Javascript-prosjekt til en Loggfila prosjekt er uunngåelig ved Loggfila natur. Loggfila sjekker all kode for gyldighet, og dermed den trenger å vite om alle funksjoner og variabler som brukes. Dermed typedefinisjoner må være på plass for dem alle ellers kompilering feil er bundet til å skje. Som nevnt i kapittelet ovenfor, for stort sett alle Javascript rammeverk det er .d.tsfiler som lett kan erverves med installasjon av DefinitelyTyped pakker . Det kan imidlertid være at du har brukt noen obskure bibliotek som det ikke Loggfila definisjoner er tilgjengelige, eller at du har polyfilled noen Javascript-primitiver. I så fall må du levere typedefinisjoner for disse bitene for at kompilering feil å forsvinne. Bare lage en .d.tsfil og ta den med i tsconfig.json er filesarray, slik at det alltid vurderes av Loggfila kompilatoren. I det erklærer de bitene som Loggfila ikke vet om som type any. Når du har fjernet alle feil kan du gradvis introdusere skrive til de deler i henhold til dine behov.

Noe arbeid på (re) konfigurering bygge rørledningen vil også være nødvendig for å få Loggfila til bygge rørledningen. Som nevnt i kapittelet om samlingen er det nok av gode ressurser der ute, og jeg oppfordrer deg til å se etter frø prosjekter som bruker en kombinasjon av verktøy du ønsker å jobbe med.

Det største hinderet er læringskurve. Jeg oppfordrer deg til å leke seg med et lite prosjekt først. Se hvordan det fungerer, hvordan det bygger, hvilke filer den bruker, hvordan den er konfigurert, hvordan den fungerer i IDE, hvordan den er bygd opp, hvilke verktøy den bruker, etc. Konvertering en stor Javascript kodebasen til Loggfila er veldig gjennomførbart når du vet hva du gjør, men det kan være frustrerende når du ikke gjør det.

Adopsjon

Loggfila er åpen kildekode (Apache 2 lisensiert under github ) og støttet av Microsoft. Anders Hejlsberg , ledelsen arkitekten av C # er i spissen for prosjektet. Det er en veldig aktiv prosjekt; Loggfila teamet har vært lanserer en rekke nye funksjoner i de siste årene, og mange store de er fortsatt planlagt å komme (se veikart ).

I 2017 Stackoverflow utvikleren undersøkelse Loggfila var den mest populære Javascript transpiler (9. plass sammenlagt) og vant tredje plass i de mest elsket programmeringsspråk kategori.

Svarte 27/01/2016 kl. 21:23
kilden bruker

stemmer
55

Loggfila gjør noe som ligner på det mindre eller sass gjør for CSS. De er super sett med det, noe som betyr at hver JS koden du skriver er gyldig typescript-kode. I tillegg kan du bruke de andre godbitene som det legger til språket, og transpiled koden vil være gyldige js. Du kan selv stille inn JS-versjonen som du vil at resultatkoden på.

Foreløpig Loggfila er et super sett ES2015, så kan være et godt valg å begynne å lære det nye js funksjoner og transpile til nødvendig standard for prosjektet.

Svarte 11/02/2016 kl. 20:32
kilden bruker

stemmer
31

" Loggfila Fundamentals " - en Pluralsight video-kurs ved Dan Wahlin og John Papa er en virkelig god, i dag (25 mars 2016) oppdatert for å gjenspeile Loggfila 1,8, introduksjon til Loggfila.

For meg de virkelig gode funksjoner, ved siden av de fine muligheter for IntelliSense, er klasser , grensesnitt , moduler , enkel å implementere AMD, og muligheten til å bruke Visual Studio Loggfila debugger når påberopes med IE.

For å oppsummere : Hvis det brukes som forutsatt, kan Loggfila gjøre Javascript programmering mer pålitelig og enklere. Det kan øke produktiviteten av Javascript programmerer betydelig over hele SDLC den.

Svarte 27/12/2015 kl. 04:18
kilden bruker

stemmer
7

ECMA-skript 5 (ES5) som alle nettleser støtter og ferdigbygd. ES6 / ES2015 og ES / 2016 kom i år med mange endringer så å dukke opp disse endringene er det noe i mellom som bør ta bryr seg om så Loggfila. • Loggfila er Typer -> Betyr må vi definere datatype for hver eiendom og metoder. Hvis du vet C # deretter Loggfila er lett å forstå. • Stor fordel av Loggfila er vi identitet Type relaterte problemer tidlig før du går til produksjon. Dette gjør at enheten tester for å mislykkes hvis det er noen form mismatch.

Svarte 06/06/2016 kl. 12:14
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more