Ce este typescript și de ce am folosi în loc de JavaScript?

voturi
1k

Puteți să vă rugăm să descrieți ce limba typescript este?

Ce se poate face ca JavaScript sau bibliotecile disponibile nu se poate face, care mi-ar da un motiv să-l ia în considerare?

Întrebat 02/10/2012 la 17:37
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
979

Am scris inițial acest răspuns atunci când era încă fierbinte typescript-off-the-presele. Cinci ani mai târziu, aceasta este o imagine de ansamblu OK, dar uita - te la răspunsul lui Lodewijk de mai jos pentru mai multă profunzime

Vedere 1000ft ...

Typescript este un superset de JavaScript , care prevede în primul rând opționale statice de tastare, clase și interfețe. Unul dintre cele mai mari beneficii este de a permite IDE - uri pentru a oferi un mediu mai bogat pentru spotting erori frecvente pe măsură ce introduceți codul .

Pentru a obține o idee despre ce vreau să spun, ma uit la film introductiv Microsoft pe limba.

Pentru un proiect mare JavaScript, de adoptare a typescript ar putea duce la software-ul mai robust, în timp ce încă dislocabile în cazul în care o aplicare regulată JavaScript ar rula.

Acesta este open source, dar veți obține doar inteligent IntelliSense pe măsură ce tastați dacă utilizați un IDE acceptat. Inițial, aceasta a fost doar Microsoft Visual Studio ( de remarcat , de asemenea , în blog de Miguel de Icaza ). Aceste zile, alte IDEs oferă sprijin prea masina de scris .

Există și alte tehnologii, cum ar fi ea?

Există CoffeeScript , dar care servește într - adevăr un scop diferit. IMHO, CoffeeScript prevede lizibilitate pentru oameni, dar , de asemenea , typescript oferă lizibilitate profundă pentru instrumente prin tastarea sale statice opțional ( a se vedea acest post de blog recent pentru un pic mai critică). Există , de asemenea , tragere la țintă , dar asta e un plin pe înlocuitor pentru JavaScript (deși poate produce cod JavaScript )

Exemplu

Ca un exemplu, iată câteva typescript (puteți juca cu acest lucru în typescript Playground )

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

Și aici este JavaScript aceasta ar produce

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

Observați cum typescript definește tipul de variabile membru și a parametrilor metodei de clasă. Acest lucru este eliminat atunci când traducerea JavaScript, dar care sunt utilizate de către IDE și compilator la fața locului erori, cum ar fi trecerea unui tip numeric pentru constructor.

Este , de asemenea , capabil să deducând tipuri care nu sunt declarate în mod explicit, de exemplu, ar determina greet()metoda returnează un șir de caractere.

Debugging typescript

Multe browsere și oferă suport de depanare IDEs directă prin sourcemaps. A se vedea această întrebare Stack Overflow pentru mai multe detalii: Debugging cod typescript cu Visual Studio

Vrei să afli mai multe?

Am scris inițial acest răspuns atunci când era încă fierbinte typescript-off-the-presele. Check out răspunsul lui Lodewijk la această întrebare pentru unele detalii mai multe curente.

Publicat 02/10/2012 la 17:41
sursa de către utilizator

voturi
674

Deși răspunsul acceptat este bine, am simțit că într-adevăr nu face typescript justiția în acest moment. Nu mai este primele zile. Typescript este de a găsi mult mai mult de adoptare acum cu mai multe cadre populare fiind scrise dactilografiat. Motivele pentru care ar trebui să alegeți typescript în loc de JavaScript sunt multe acum.

Relația cu JavaScript

JavaScript este standardizat prin standardele ECMAScript. Nu toate browserele în sprijinul folosi toate caracteristicile standardelor ECMAScript mai noi ( a se vedea acest tabel ). Typescript sprijină noi standarde ECMAScript și le compilează la obiective (mai mari) ECMAScript la alegere (țintele actuale sunt de 3, 5 și 6 [aka 2015]). Acest lucru înseamnă că puteți utiliza caracteristici ale ES2015 și dincolo, cum ar fi module, functii lambda, clase, operatorul răspândirea, destructurare, astăzi. De asemenea , adaugă tip de suport desigur, care nu face parte din orice standard ECMAScript și probabil nu se poate datora naturii interpretate în loc de natura compilat JavaScript. Sistemul de tip dactilografiate este relativ bogată și include: interfețele, ENUM, tipuri hibride, generice, reuniune și intersecție tipuri, modificatori de acces și multe altele. Site - ul oficial dactilografiate oferă o imagine de ansamblu a acestor caracteristici.

Relația cu alte limbi de direcționare JavaScript

Typescript are o filozofie unică în comparație cu alte limbi care compilează JavaScript. Codul JavaScript este valabil codul masina de scris; Typescript este un superset JavaScript. Aproape Puteți redenumiți .jsfișiere pentru .tsfișiere și începe să utilizați dactilografiate. Fișierele typescript sunt compilate pentru a fi citite JavaScript, astfel încât migrația din spate este posibilă și înțelegerea typescript compilat nu este greu deloc. În acest fel typescript se bazează pe succesele JavaScript îmbunătățind în același timp pe punctele slabe ale acestuia.

Pe de o parte, aveți instrumente în viitor , care să ia standarde moderne ECMAScript și compilați - l în jos la versiunile mai vechi JavaScript cu Babel fiind cel mai popular. Pe de altă parte, aveți limbi care pot fi diferite în totalitate de JavaScript care vizează JavaScript, cum ar fi Coffeescript, Clojure, Dart, Ulm, haXe, ScalaJs, și o întreagă serie mai ( a se vedea această listă ). Aceste limbi, deși acestea ar putea fi mai bine decât în cazul în care viitorul JavaScript ar putea duce vreodată, un risc mai mare de a nu găsi suficient de adoptare pentru viitorul lor să fie garantată. S-ar putea avea , de asemenea , mai multe probleme cu găsirea de dezvoltatori cu experiență pentru unele dintre aceste limbi, deși cele pe care le vor găsi poate fi de multe ori mai entuziaști. Interop cu JavaScript poate fi , de asemenea , un pic mai implicat, deoarece acestea sunt mai departe eliminate din ceea ce este de fapt JavaScript.

Typescript se află între aceste două extreme, echilibrând astfel riscul. Typescript nu este o alegere riscantă de orice standard. Este nevoie de foarte puțin efort să se obișnuiască dacă sunteți familiarizați cu JavaScript, deoarece nu este un limbaj complet diferit, are suport excelent interoperabilitate JavaScript și a văzut o mulțime de adoptare recent.

Opțional dactilografiere static și tipul de inferență

este tastat dinamic JavaScript. Acest lucru înseamnă că JavaScript nu știe ce tip este o variabilă până când este de fapt instantiat la run-time. Acest lucru înseamnă, de asemenea, că ar putea fi prea târziu. Typescript adaugă tip de suport pentru JavaScript. Bug-uri, care sunt cauzate de presupuneri false ale unor ființe variabile de un anumit tip poate fi eradicată complet daca iti joci cartile dreapta; strictețea ce introduceți codul sau dacă introduceți codul de la toate este de până la tine.

Typescript face tastarea un pic mai ușor și mult mai puțin explicită prin utilizarea de tip inferență. De exemplu: var x = "hello"dactilografiat este aceeași ca și var x : string = "hello". Tipul este pur și simplu deduce din utilizarea sa. Chiar că nu tastați în mod explicit tipurile, ele sunt încă acolo pentru a vă salva de la a face ceva care , altfel , ar avea ca rezultat o eroare de run-time.

Typescript este opțional tastat în mod implicit. De exemplu , function divideByTwo(x) { return x / 2 }este o funcție validă dactilografiat , care poate fi numit cu orice fel de parametru, chiar dacă numindu - l cu un șir de caractere va avea ca rezultat , evident , într - o execuție de eroare. La fel ca tine sunt utilizate în JavaScript. Acest lucru funcționează, pentru că atunci când nici un tip a fost atribuit în mod explicit , iar tipul nu a putut fi dedusă, la fel ca în exemplul de divideByTwo, typescript va atribui implicit tipul any. Aceasta înseamnă că tipul de semnătură funcția divideByTwo devine automat function divideByTwo(x : any) : any. Există un steag compilator pentru a nu permite acest comportament: --noImplicitAny. Activarea acestui marcaj vă oferă un grad mai mare de siguranță, dar , de asemenea , înseamnă că va trebui să facă mai mult tastare.

Tipurile au un cost asociat cu ei. În primul rând există o curbă de învățare, și în al doilea rând, desigur, va costa un pic mai mult timp pentru a configura o bază de cod utilizând tastarea strictă corespunzătoare prea. În experiența mea, aceste costuri sunt total merita pe orice bază de cod de gravă partajați cu alții. Un studiu la scară mare de limbaje de programare și cod de calitate în Github sugerează că „că limbile tastate în general static sunt mai puțin predispuse la defecte decât tipurile dinamice, și că tastarea puternică este mai bună decât tastarea slabă în aceeași vedere“.

Este interesant de observat că această aceeași lucrare constată că typescript este mai puțin predispuse la erori, apoi JavaScript:

Pentru cei cu coeficienți pozitivi ne putem aștepta ca limbajul este asociat cu, ceteris paribus, un număr mai mare de remedieri defecte. Aceste limbi includ C, C ++, JavaScript , Objective-C, PHP, si Python. Limbile Clojure, Haskell, Ruby, Scala, și typescript , toți au coeficienți negativi ceea ce implică faptul că aceste limbi sunt mai puțin probabil decât media de a duce la fixarea defectului comite.

suport îmbunătățit IDE

Experiența de dezvoltare cu o mașină de scris este mare imbunatatire peste JavaScript. IDE-ul este informat în timp real de către compilator typescript pe informațiile sale de tip bogat. Acest lucru oferă câteva avantaje majore. De exemplu, cu typescript puteți face în condiții de siguranță, cum ar fi refactorings renames la nivelul întregii codebase. Prin finalizarea cod puteți obține ajutor în linie pe orice funcții de bibliotecă s-ar putea oferi. Nu mai este nevoie să le amintească sau să se uite-le în referințe on-line. erorile de compilare sunt raportate direct în IDE cu o linie șerpuită roșie în timp ce sunteți ocupat de codificare. Toate în toate acestea pentru a permite un câștig semnificativ în productivitate comparativ cu lucrul cu JavaScript. Se poate petrece mai mult timp de codificare și mai puțin timp de depanare.

Există o gamă largă de IDE-uri care au suport excelent pentru typescript, cum ar fi Visual Studio & VS cod, Atom, Sublime, și IntelliJ / WebStorm.

controale stricte nule

Runtime erori de formă cannot read property 'x' of undefinedsau undefined is not a functionsunt foarte frecvent cauzate de bug - uri în cod JavaScript. Din cele typescript caseta reduce deja probabilitatea acestor tipuri de erori care apar, deoarece nu se poate utiliza o variabilă care nu este cunoscut de compilator typescript (cu excepția proprietăților anyvariabilelor tastate). Este încă posibil să se utilizeze , deși în mod greșit o variabilă care este setat undefined. Cu toate acestea, cu versiunea 2.0 dactilografiate puteți elimina aceste tipuri de erori toate împreună , prin utilizarea de tipuri de non- poate fi nulă. Acest lucru funcționează după cum urmează:

Cu controale stricte nule activat ( --strictNullCheckspavilion compilator) compilatorul typescript nu va permite undefinedsă i se atribuie unei variabile , dacă nu îl declară în mod explicit să fie de tip poate fi nulă. De exemplu, let x : number = undefinedva avea ca rezultat o eroare de compilare. Acest lucru se potrivește perfect cu teoria de tip, deoarece undefinednu este un număr. Se poate defini xca fiind un tip de sumă numberși undefinedpentru a corecta acest lucru: let x : number | undefined = undefined.

Odată ce un tip este cunoscut a fi poate fi nulă, ceea ce înseamnă că este un tip care poate fi , de asemenea , din valoarea nullsau undefined, compilatorul typescript poate determina printr -un control pe baza fluxului de analiză de tip dacă este sau nu codul poate utiliza în condiții de siguranță o variabilă sau nu. Cu alte cuvinte , atunci când verificați o variabilă este undefinedprin intermediul , de exemplu , o ifdeclarație compilatorul va deduce typescript că tipul în acea ramură a fluxului de control codul nu mai este , prin urmare , poate fi nulă și pot fi utilizate în condiții de siguranță. Aici este un exemplu simplu:

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.

În timpul construi 2016 conferință co-designerul dactilografiate Anders Hejlsberg a dat o explicație detaliată și demonstrație a acestei caracteristici: film ( de la 44:30 la 56:30).

Compilare

Pentru a utiliza mașina de scris aveți nevoie de un proces de construcție pentru a compila codul JavaScript. Procesul de construcție durează , în general , doar câteva secunde , în funcție de desigur , de dimensiunea proiectului. Compilatorul typescript suportă compilare incrementală ( --watchcompilator de pavilion), astfel încât toate modificările ulterioare pot fi compilate la o viteză mai mare.

Compilatorul typescript poate inline informații cartografice sursă în fișierele generate js sau să creați fișiere .map separate. Sursa de informații cartografice pot fi utilizate de depanare utilități , cum ar fi DevTools Chrome și alte IDE pentru a corela liniile din JavaScript pentru cei care le -au generat în dactilografiate. Acest lucru face posibil pentru tine pentru a seta puncte de întrerupere și de a inspecta variabile în timpul rulării direct pe codul dactilografiate. Informații harta Sursa funcționează destul de bine, a fost în jurul valorii de mult timp înainte de typescript, dar depanare typescript nu este , în general , la fel de mare ca atunci când se utilizează în mod direct JavaScript. Ia thiscuvântul cheie , de exemplu. Datorită semantica modificate ale thiscuvântului cheie în jurul valorii de închidere , deoarece ES2015, thispoate exista de fapt , în timpul rulării ca o variabilă numită _this( a se vedea acest răspuns ). Acest lucru s -ar putea confunda timpul de depanare, dar , în general , nu este o problemă dacă știți despre ea sau inspectați codul JavaScript. Trebuie remarcat faptul că Babel suferă același tip exact de problemă.

Există alte câteva trucuri compilatorul typescript poate face, cum ar fi generarea de cod intercepteze bazat pe decoratori , generarea de cod modul de încărcare pentru diferite sisteme de module și analiză JSX . Cu toate acestea, veți avea nevoie de un instrument probabil construi pe langa compilatorul dactilografiate. De exemplu , dacă doriți să comprimați codul pe care va trebui să adăugați alte instrumente pentru a construi procesul de a face acest lucru.

Există plugin - uri de compilare typescript disponibile pentru WebPACK , Gulp , Grunt și destul de mult orice alt instrument JavaScript pentru a construi acolo. Documentația typescript are o secțiune privind integrarea cu uneltele de compilare care acoperă - le pe toate. Un Linter este disponibil și în cazul în care doriți și mai mult timpul de construcție de verificare. Există , de asemenea , un număr mare de proiecte de sămânță acolo , care vor obține ai început cu mașina de scris , în combinație cu o grămadă de alte tehnologii , cum ar fi Angular 2, React, Ember, SystemJs, WebPACK, Gulp, etc.

interoperabilitate JavaScript

Deoarece typescript este atât de strâns legată de JavaScript are capacități mari de interoperabilitate, dar este necesară o muncă suplimentară pentru a lucra cu biblioteci JavaScript dactilografiat. Definiții typescript sunt necesare , astfel încât compilatorul typescript înțelege că funcția solicită ca _.groupBysau angular.copysau $.fadeOutnu sunt de fapt declarații ilegale. Definițiile pentru aceste funcții sunt plasate în .d.tsfișiere.

Cea mai simplă formă o definiție poate lua este de a permite unui identificator să fie utilizat în nici un fel. De exemplu, atunci când se utilizează Lodash , un fișier de definiție singură linie declare var _ : anyva permite să apelați orice funcție pe care doriți pe _, dar, desigur , sunteți , de asemenea , încă în măsură să facă greșeli: _.foobar()ar fi un apel typescript legală, dar este, desigur , un apel ilegal la run-time. Dacă doriți suport de tip adecvat și completarea automată a codului fișierul definiție trebuie să mai exact ( a se vedea definițiile lodash pentru un exemplu).

Modulele NPM care vin de pre-ambalate , cu propriile lor definiții de tip sunt înțelese în mod automat de către compilator typescript ( a se vedea documentația ). Pentru destul de mult orice altă bibliotecă semi-populare JavaScript care nu include propria definiții cineva acolo a făcut deja definiții de tip disponibile prin intermediul unui alt modul NPM. Aceste module sunt prefixate cu „tipuri @ /“ și provin dintr - un depozit Github numit DefinitelyTyped .

Există o opoziție: definițiile de tip trebuie să se potrivească cu versiunea bibliotecii pe care îl utilizați la run-time. Dacă nu, typescript ar putea să interziceți apelarea unei funcții sau dereferencing o variabilă care există sau vă permit să apelați o funcție sau endiancu o variabilă care nu există, pur și simplu pentru că tipurile nu se potrivesc run-time la momentul compilarii . Deci, asigurați-vă că încărcați versiunea corectă a definițiilor de tip pentru versiunea corectă a bibliotecii pe care îl utilizați.

Pentru a fi sincer, există o ușoară fără griji pentru acest lucru și poate fi unul dintre motivele pentru care nu alege typescript, dar în schimb du-te pentru ceva de genul Babel, care nu suferă de a avea pentru a obține definiții de tip la toate. Pe de altă parte, dacă știi ce faci poți depăși cu ușurință orice fel de probleme cauzate de fișiere incorecte sau lipsă definiție.

Conversia de la JavaScript pentru a typescript

Orice .jsfișier poate fi redenumit - o .tsși a fugit prin compilator typescript pentru a obține sintactică același cod JavaScript ca o ieșire (dacă a fost corect sintactic în primul rând). Chiar și atunci când compilatorul typescript devine erori de compilare va produce în continuare un .jsfișier. Se poate accepta chiar și .jsfișierele de intrare cu --allowJssteagul. Acest lucru vă permite să începeți cu mașina de scris imediat. Din păcate , erorile de compilare sunt probabil să apară la început. Unul are nevoie să ne amintim că acestea nu sunt arată-oprire erori ca tine pot fi utilizate pentru alte compilatoare.

Erorile de compilare devine una la început , când conversia unui proiect JavaScript pentru un proiect typescript sunt inevitabile , prin natura lui masina de scris. Typescript verifică toate codul pentru valabilitate și , prin urmare, trebuie să cunoască despre toate funcțiile și variabilele care sunt utilizate. Astfel , definițiile de tip trebuie să fie în loc pentru toate erorile de compilare în caz contrar sunt obligate să aibă loc. După cum sa menționat în capitolul de mai sus, pentru destul de mult orice cadru JavaScript există .d.tsfișiere care pot fi ușor achiziționate cu instalarea pachetelor DefinitelyTyped . S - ar putea fi , totuși , că ați folosit o anumită bibliotecă obscure pentru care nu sunt disponibile definiții dactilografiere ori pe care le - ați polyfilled unele primitivele JavaScript. În acest caz , trebuie să furnizeze definițiile de tipul acestor biți, pentru erorile de compilare a dispara. Doar creați un .d.tsfișier și să o includă în tsconfig.json de filesmatrice, astfel încât acesta este considerat întotdeauna de compilator dactilografiate. În ea declară că acei biți typescript nu știe ca tip any. După ce ați eliminat toate erorile pot introduce treptat tastarea acelor părți în funcție de nevoile dumneavoastră.

De asemenea, va fi nevoie de ceva de lucru pe (re) configurarea conductei dvs. de a construi pentru a obține typescript în conducta construi. După cum sa menționat în capitolul privind compilarea există o mulțime de resurse bune acolo și vă încurajez să caute proiecte de semințe care utilizează o combinație de instrumente pe care doriți să fie de lucru cu.

Cel mai mare obstacol este curba de invatare. Vă încurajez să se joace în jurul cu un mic proiect la început. Uite cum funcționează, cum se construiește, pe care-l folosește fișiere, cum este configurat, modul în care funcționează în IDE-ul, modul în care este structurat, pe care instrumentele pe care le folosește, etc Conversia unui mare JavaScript pentru codul de bază este foarte greu de realizat typescript când știu ce faci, dar ar putea fi frustrant atunci când nu.

Adopţie

Typescript este open source (Apache 2 licențiat, a se vedea github ) și susținută de Microsoft. Anders Hejlsberg , arhitectul principal al C # este varful de lance al proiectului. Este un proiect foarte activ; echipa typescript a fost eliberarea o mulțime de caracteristici noi în ultimii ani și o mulțime de cei mari sunt încă planificate să vină (vezi foaia de parcurs ).

În 2017 sondajul StackOverflow dezvoltator typescript a fost cel mai popular transpiler JavaScript (locul 9 în ansamblu) și a câștigat locul al treilea în categoria limbaj de programare cel mai iubit.

Publicat 27/01/2016 la 21:23
sursa de către utilizator

voturi
49

Typescript face ceva similar cu ceea ce face mai puțin sau Sass pentru CSS. Ele sunt super-seturi de ea, ceea ce înseamnă că fiecare cod de JS scrieți este cod valid masina de scris. În plus, puteți utiliza alte bunătăți pe care le adaugă la limba și codul transpiled va fi js valide. Puteți seta chiar și versiunea JS pe care doriți codul rezultat pe.

În prezent, este un set typescript super ES2015, astfel încât ar putea fi o alegere bună pentru a începe de învățare caracteristici js și transpile noi la standardul necesar pentru proiectul dumneavoastră.

Publicat 11/02/2016 la 20:32
sursa de către utilizator

voturi
29

" Fundamentele typescript " - un video curs de Pluralsight Dan Wahlin și John Papa este un foarte bun, în prezent (25 martie 2016) , actualizate pentru a reflecta typescript 1.8, introducerea la dactilografiate.

Pentru mine caracteristici foarte bune, alături de posibilitățile de frumos Intellisense, sunt clase , interfețe , module , ușurința de punere în aplicare AMD, precum și posibilitatea de a utiliza Visual Studio depanatorul typescript când este invocată cu IE.

Pentru a rezuma : În cazul în care sunt utilizate conform destinației, typescript poate face programarea JavaScript mai fiabile și mai ușor. Acesta poate crește productivitatea programator JavaScript semnificativ peste întregul SDLC.

Publicat 27/12/2015 la 04:18
sursa de către utilizator

voturi
7

ECMA script 5 (ES5), care tot sprijinul browser-ul și precompilate. ES6 / ES2015 și ES / 2016 a venit în acest an cu o mulțime de modificări, astfel pentru a deschide aceste schimbări există ceva între care ar trebui să ia atât de griji cu privire la dactilografiate. • typescript este Tipuri -> înseamnă că trebuie să se definească tipul de date al fiecărei proprietăți și metode. Dacă știți C #, atunci mașina de scris este ușor de înțeles. • mare avantaj dactilografiate este tastam identitate probleme legate de devreme, înainte de a merge la producție. Acest lucru permite teste unitare să eșueze dacă există orice tip de nepotrivire.

Publicat 06/06/2016 la 12:14
sursa de către utilizator

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