Puoi prega di descrivere ciò che il linguaggio dattiloscritto è?
Cosa può fare che JavaScript o librerie disponibili non possono fare, che mi avrebbe dato ragione a considerarlo?
Puoi prega di descrivere ciò che il linguaggio dattiloscritto è?
Cosa può fare che JavaScript o librerie disponibili non possono fare, che mi avrebbe dato ragione a considerarlo?
Originariamente ho scritto questa risposta quando tipografico era ancora caldo-off-the-presse. Cinque anni più tardi, questa è una panoramica OK, ma guardate la risposta di Lodewijk sotto per più di profondità
Dattiloscritto è un superset di JavaScript che fornisce principalmente opzionali statici di battitura, classi e interfacce. Uno dei grandi vantaggi è quello di consentire IDE per fornire un ambiente più ricco per individuare gli errori più comuni durante la digitazione del codice .
Per avere un'idea di quello che voglio dire, guardare i video introduttivo di Microsoft sulla lingua.
Per un grande progetto JavaScript, adottando tipografico potrebbe comportare il software più robusto, pur essendo schierabile in cui una normale applicazione JavaScript correrebbe.
E 'open source, ma si ottiene solo l'intelligente Intellisense durante la digitazione se si utilizza un IDE supportati. Inizialmente, questo era solo Visual Studio di Microsoft (nota anche nel post sul blog da Miguel de Icaza ). In questi giorni, altri IDE offrono un supporto dattiloscritto troppo .
C'è CoffeeScript , ma che in realtà uno scopo diverso. IMHO, CoffeeScript offre leggibilità per gli esseri umani, ma tipografico offre anche profonda leggibilità per strumenti attraverso la sua tipizzazione statica opzionale (si veda questo recente post sul blog per un po 'più critica). C'è anche Dart ma questo è un pieno sul sostituto di JavaScript (anche se in grado di produrre codice JavaScript )
A titolo di esempio, ecco qualche dattiloscritto (si può giocare con questo nel dattiloscritto Playground )
class Greeter {
greeting: string;
constructor (message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
Ed ecco il JavaScript produrrebbe
var Greeter = (function () {
function Greeter(message) {
this.greeting = message;
}
Greeter.prototype.greet = function () {
return "Hello, " + this.greeting;
};
return Greeter;
})();
Si noti come il dattiloscritto definisce il tipo di variabili e parametri di metodo di classe. Questo viene rimosso quando si traduce a JavaScript, ma utilizzato dal IDE e compilatore di individuare errori, come passare un tipo numerico al costruttore.
E 'anche in grado di inferire i tipi che non sono esplicitamente dichiarati, per esempio, sarebbe determinare il greet()metodo restituisce una stringa.
Molti browser e IDE offrono supporto diretto debugging attraverso sourcemaps. Vedere questa domanda Stack Overflow per maggiori dettagli: il debug di codice dattiloscritto con Visual Studio
Originariamente ho scritto questa risposta quando tipografico era ancora caldo-off-the-presse. Scopri la risposta di Lodewijk a questa domanda per qualche dettaglio più attuale.
Anche se la risposta accettata va bene, mi sono sentito davvero non fa dattiloscritto giustizia a questo punto. Non sono i primi giorni più. Dattiloscritto sta trovando molto di più l'adozione ora con diversi quadri famosi scritti a macchina. I motivi per cui si dovrebbe scegliere dattiloscritto invece di JavaScript sono molti ora.
JavaScript è standardizzata attraverso gli standard ECMAScript. Non tutti i browser a sostegno utilizzare tutte le funzionalità di standard più recenti ECMAScript (vedi questa tabella ). Dattiloscritto supporta nuovi standard ECMAScript e li compila in bersagli (vecchi) ECMAScript di tua scelta (obiettivi attuali sono 3, 5 e 6 [aka 2015]). Ciò significa che è possibile utilizzare le funzioni di ES2015 e al di là, come moduli, funzioni lambda, classi, l'operatore di diffusione, destrutturazione, oggi. Si aggiunge anche il tipo di supporto, naturalmente, che non è parte di qualsiasi standard ECMAScript e potrebbe probabilmente mai a causa della natura interpretata invece di natura compilata di JavaScript. Il sistema di tipo tipografico è relativamente ricca e comprende: interfacce, enumerazioni, i tipi di ibridi, farmaci generici, i tipi di unione e intersezione, modificatori di accesso e molto altro ancora. Il sito ufficiale del dattiloscritto offre una panoramica di queste caratteristiche.
Carattere tipografico ha una filosofia unica rispetto ad altre lingue che compilano a JavaScript. Il codice JavaScript è un codice tipografico valida; Dattiloscritto è un superset di JavaScript. Si può quasi rinominare i .jsfile per .tsfile e iniziare a utilizzare dattiloscritto. File dattiloscritto vengono compilati a leggibile JavaScript, in modo che la migrazione è tornato possibile e la comprensione del dattiloscritto compilato non è difficile a tutti. In questo modo dattiloscritto si basa sui successi di JavaScript migliorando sulle sue debolezze.
Da un lato, si dispone di strumenti a prova di futuro che prendono moderni standard ECMAScript e compilarlo verso il basso per le vecchie versioni JavaScript con Babel è il più popolare. D'altra parte, si dispone di lingue che possono differire totalmente da JavaScript che prendono di mira JavaScript, come CoffeeScript, Clojure, Dart, Elm, Haxe, ScalaJs, e tutta una serie di più (vedi questa lista ). Queste lingue, anche se potrebbe essere migliore di dove il futuro di JavaScript potrebbe mai condurre, corrono un rischio maggiore di non trovare abbastanza adozione per il loro futuro a essere garantita. Si potrebbe anche avere più problemi a trovare sviluppatori esperti per alcune di queste lingue, anche se quelli che troverete spesso può essere più entusiasta. Interoperabilità con JavaScript può anche essere un po 'più complesso, in quanto sono più rimossi da ciò che effettivamente è JavaScript.
Tipografico si trova tra questi due estremi, bilanciando così il rischio. Dattiloscritto non è una scelta rischiosa da qualsiasi standard. Ci vuole poco sforzo per abituarsi se si ha familiarità con JavaScript, dato che non è una lingua completamente diversa, ha un supporto eccellente interoperabilità JavaScript e ha visto un sacco di adozione di recente.
è dinamicamente digitato JavaScript. Ciò significa JavaScript non sa che tipo di una variabile è fino a quando non è in realtà un'istanza in fase di esecuzione. Questo significa anche che potrebbe essere troppo tardi. Dattiloscritto aggiunge digitare il supporto a JavaScript. Bug che sono causate da falsi presupposti di un essere variabile di un certo tipo possono essere completamente sradicati se si gioca bene le tue carte; come stretto si digita il codice o se si digita il codice a tutti sta a voi.
Dattiloscritto permette di digitare un po 'più facile e molto meno esplicita dall'uso di inferenza di tipo. Ad esempio: var x = "hello"a macchina è la stessa var x : string = "hello". Il tipo è semplicemente dedotto dal suo utilizzo. Anche esso non si digita in modo esplicito i tipi, sono ancora lì per salvarti dal fare qualcosa che altrimenti si tradurrebbe in un errore di run-time.
Dattiloscritto è opzionalmente digitato per impostazione predefinita. Ad esempio function divideByTwo(x) { return x / 2 }è una funzione valida a macchina, che può essere chiamato con qualsiasi tipo di parametro, pur chiamando con una stringa ovviamente tradurrà in un runtime errore. Proprio come si è abituati a in JavaScript. Questo funziona, perché quando nessun tipo è stato esplicitamente assegnato e il tipo non poteva essere dedotta, come nell'esempio divideByTwo, dattiloscritto implicitamente assegnare il tipo any. Questo significa che la firma tipo della funzione divideByTwo diventa automaticamente function divideByTwo(x : any) : any. C'è un flag di compilazione per non consentire questo comportamento: --noImplicitAny. L'attivazione di questo flag ti dà un maggior grado di sicurezza, ma significa anche si dovrà fare di più a scrivere.
Tipi hanno un costo associato con loro. Prima di tutto v'è una curva di apprendimento, e in secondo luogo di tutti, ovviamente, vi costerà un po 'più di tempo per impostare una base di codice utilizzando corretta tipizzazione forte troppo. Nella mia esperienza, questi costi sono totalmente la pena su una base di codice serio si condivide con gli altri. Un ampio studio Scala di linguaggi di programmazione e Quality Code in Github suggerisce che "che i linguaggi staticamente tipizzati in generale, sono meno inclini difetto rispetto ai tipi dinamici, e che la tipizzazione forte è meglio di tipizzazione debole nella stessa materia".
È interessante notare che questo stesso giornale rileva che dattiloscritto è meno soggetto ad errori, allora JavaScript:
Per quelli con coefficienti positivi ci si può aspettare che la lingua è associata, ceteris paribus, un maggior numero di correzioni di errori. Queste lingue includono C, C ++, Javascript , Objective-C, PHP e Python. Le lingue Clojure, Haskell, Ruby, Scala, e tipografico , tutti hanno coefficienti negativi implica che queste lingue sono meno probabili rispetto alla media al risultato nel fissaggio dei difetti si impegna.
L'esperienza di sviluppo con dattiloscritto è un grande miglioramento rispetto JavaScript. L'IDE è informato in tempo reale dal compilatore dattiloscritto sulla sua ricca informazioni sul tipo. Questo dà un paio di importanti vantaggi. Ad esempio, con dattiloscritto si può tranquillamente fare refactoring come rinomina in tutta la vostra intera base di codice. Attraverso il completamento del codice è possibile ottenere aiuto in linea su qualunque funzioni di una libreria potrebbe offrire. Non più bisogno di ricordare loro o cercare di riferimenti online. errori di compilazione vengono segnalati direttamente nell'IDE con una linea ondulata rossa mentre si esegue la codifica occupato. Tutto sommato, questo consente un notevole aumento della produttività rispetto a lavorare con JavaScript. Si può trascorrere più tempo di codifica e meno debugging tempo.
V'è una vasta gamma di IDE che hanno un eccellente supporto per tipografico, come Visual Studio & VS codice, Atomo, Sublime, e IntelliJ / WebStorm.
Errori di runtime della forma cannot read property 'x' of undefinedo undefined is not a functionsono molto comunemente causate da bug nel codice JavaScript. Fuori dalla scatola dattiloscritto già riduce la probabilità di questi tipi di errori che si verificano, poiché non si può utilizzare una variabile che non è noto al compilatore dattiloscritto (con l'eccezione di proprietà delle anyvariabili tipizzate). E 'ancora possibile però utilizzare erroneamente una variabile che viene impostata undefined. Tuttavia, con la versione 2.0 del dattiloscritto è possibile eliminare questi tipi di errori tutti insieme attraverso l'utilizzo di tipi non nullable. Questo funziona come segue:
Con rigorosi controlli nulli abilitati ( --strictNullChecksflag di compilazione) il compilatore dattiloscritto non permetterà undefineddi essere assegnato ad una variabile a meno che non si dichiara esplicitamente di essere di tipo nullable. Ad esempio, let x : number = undefinedsi tradurrà in un errore di compilazione. Questo si sposa perfettamente con la teoria di tipo, dal momento che undefinednon è un numero. Si può definire xcome un tipo somma di numbere undefinedper correggere questo: let x : number | undefined = undefined.
Una volta che un tipo è noto per essere annullabile, che significa che è di un tipo che può anche essere di valore nullo undefined, il compilatore tipografico può determinare, attraverso il controllo di flusso in base all'analisi tipo se il codice può tranquillamente utilizzare una variabile o meno. In altre parole, quando si controlla una variabile è undefinedattraverso ad esempio una ifdichiarazione il compilatore dattiloscritto si dedurre che il tipo in quel ramo del flusso di controllo del codice non è più annullabile e quindi può essere tranquillamente utilizzato. Qui c'è un semplice esempio:
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.
Durante la build 2016 conferenza di co-progettista del dattiloscritto Anders Hejlsberg ha dato una spiegazione dettagliata e la dimostrazione di questa funzione: il video (da 44:30 a 56:30).
Per utilizzare dattiloscritto è necessario un processo di compilazione per la compilazione di codice JavaScript. Il processo di compilazione richiede in genere solo un paio di secondi, a seconda ovviamente delle dimensioni del vostro progetto. Il compilatore dattiloscritto supporta la compilazione incrementale ( --watchcompilatore bandiera), in modo che tutte le modifiche successive possono essere compilati a maggiore velocità.
Il compilatore può inline dattiloscritto informazioni mappa fonte nei file generati js o creare file .map separati. Fonte informazioni mappa può essere utilizzato da debugging programmi di utilità come le DevTools Chrome e altri IDE di mettere in relazione le linee nella Javascript per quelli che li hanno generati nel dattiloscritto. In questo modo è possibile per voi di impostare punti di interruzione e ispezionare le variabili durante il runtime direttamente sul vostro codice dattiloscritto. Mappa fonte di informazione funziona piuttosto bene, è stato intorno a lungo prima tipografico, ma il debug dattiloscritto non è generalmente così grande come quando si utilizza direttamente JavaScript. Prendere la thisparola chiave, per esempio. A causa delle mutate semantica della thisparola chiave intorno chiusure dal ES2015, thispotrebbe in realtà esiste in fase di runtime come una variabile chiamata _this(vedi questa risposta ). Questo può confondere voi durante il debug, ma in genere non è un problema se si sa su di esso o ispezionare il codice JavaScript. Va notato che Babel subisce l'esatto stesso tipo di problema.
Ci sono alcuni altri trucchi il compilatore tipografico può fare, come la generazione di intercettazione codice basato su decoratori , generando modulo di codice di caricamento per diversi sistemi di moduli e l'analisi JSX . Tuttavia, è probabile che richiedono un tool di creazione oltre al compilatore tipografico. Per esempio, se si vuole comprimere il codice si dovrà aggiungere altri strumenti per il processo di compilazione di farlo.
Ci sono plugin di compilazione dattiloscritto disponibili per Webpack , Gulp , Grunt e praticamente qualsiasi altro strumento di compilazione JavaScript là fuori. La documentazione dattiloscritto ha una sezione su l'integrazione con strumenti di compilazione tutti loro copertura. Un linter è disponibile anche nel caso in cui si desidera ancora di più costruire il controllo del tempo. Ci sono anche un gran numero di progetti di semi là fuori che vi consentiranno di iniziare con il dattiloscritto in combinazione con una serie di altre tecnologie come angolare 2, Reagire, Ember, SystemJs, WebPack, Gulp, etc.
Dal momento che dattiloscritto è così strettamente legato a JavaScript ha grandi capacità di interoperabilità, ma qualche lavoro extra è necessario per lavorare con librerie JavaScript a macchina. Definizioni dattiloscritto sono necessari in modo che il compilatore dattiloscritto capisce che le chiamate di funzione come _.groupByo angular.copyo $.fadeOutnon sono in realtà dichiarazioni illegali. Le definizioni per queste funzioni sono collocati in .d.tsfile.
La forma più semplice di una definizione può prendere è quello di consentire un identificatore da utilizzare in alcun modo. Ad esempio, quando si utilizza Lodash , un file di definizione singola linea declare var _ : anyvi permetterà di chiamare qualsiasi funzione che si desidera su _, ma poi, naturalmente, si sono anche ancora in grado di fare errori: _.foobar()sarebbe una chiamata dattiloscritto legale, ma è ovviamente una chiamata illegale in fase di esecuzione. Se si desidera il supporto adeguato tipo e il completamento del codice tuo file di definizione ha bisogno di essere più precisi (vedi definizioni lodash per un esempio).
Moduli npm che vengono pre-confezionati con le proprie definizioni di tipo sono comprese automaticamente dal compilatore dattiloscritto (vedi documentazione ). Per praticamente qualsiasi altra libreria semi-popolare JavaScript che non include la propria definizioni qualcuno là fuori ha già fatto le definizioni di tipo disponibili attraverso un altro modulo NPM. Questi moduli sono prefissati con "tipi @ /" e provengono da un repository Github chiamato DefinitelyTyped .
C'è un avvertimento: le definizioni di tipo deve corrispondere alla versione della libreria che si sta utilizzando in fase di esecuzione. Se non lo fanno, Carattere tipografico potrebbe impedire voi dal richiamo di una funzione o di dereferenziando una variabile che esiste o consentono di chiamare una funzione o dereference una variabile che non esiste, semplicemente perché i tipi non corrispondono il run-time a tempo di compilazione . Quindi assicuratevi di caricare la versione corretta delle definizioni del tipo per la versione corretta della libreria che si sta utilizzando.
Per essere onesti, c'è un leggero fastidio a questo e può essere uno dei motivi che non sceglie Carattere tipografico, ma invece andare per qualcosa di simile Babel che non soffrono di dover ottenere definizioni di tipo a tutti. D'altra parte, se si sa cosa si sta facendo si può facilmente superare qualsiasi tipo di problemi causati da file di definizione non corretti o mancanti.
Ogni .jsfile può essere rinominato in un .tse corse attraverso il compilatore dattiloscritto per ottenere sintatticamente lo stesso codice JavaScript come uscita (se era sintatticamente corretto in primo luogo). Anche quando il compilatore dattiloscritto ottiene gli errori di compilazione sarà ancora produrre un .jsfile. Si può anche accettare il .jsfile come input con la --allowJsbandiera. Questo vi permette di iniziare con dattiloscritto subito. Purtroppo gli errori di compilazione probabile che si verifichino in principio. Uno ha bisogno di ricordare che questi non sono show-stopping errori, come si può essere abituati con altri compilatori.
Gli errori di compilazione si ha all'inizio, quando la conversione di un progetto JavaScript per un progetto dattiloscritto sono inevitabili per natura del dattiloscritto. Dattiloscritto controlla tutto il codice per la validità e quindi ha bisogno di conoscere tutte le funzioni e le variabili che vengono utilizzate. Così definizioni di tipo devono essere in vigore per tutti gli errori di compilazione altrimenti sono destinati a verificarsi. Come già detto nel capitolo precedente, per quasi tutti i framework JavaScript ci sono .d.tsfile che possono essere facilmente acquistati con l'installazione di pacchetti DefinitelyTyped . Potrebbe tuttavia essere che hai utilizzato qualche oscuro libreria per la quale non sono disponibili le definizioni macchina o che hai polyfilled alcune primitive JavaScript. In tal caso è necessario fornire definizioni di tipo per questi bit in modo che gli errori di compilazione a scomparire. Basta creare un .d.tsfile di e includerlo nel del tsconfig.json filesmatrice, in modo che sia sempre considerato dal compilatore dattiloscritto. In esso dichiarare le bit che dattiloscritto non conosce come tipo any. Una volta che hai eliminato tutti gli errori è possibile introdurre gradualmente la tipizzazione a quelle parti in base alle proprie esigenze.
Alcuni lavori sulla (ri) configurazione del gasdotto di build sarà anche necessario per ottenere tipografico nella pipeline build. Come accennato nel capitolo sulla compilation ci sono un sacco di buone risorse là fuori e vi incoraggio a cercare i progetti di sementi che utilizzano la combinazione di strumenti che si desidera lavorare con.
Il più grande ostacolo è la curva di apprendimento. Vi incoraggio a giocare con un piccolo progetto in un primo momento. Guardate come funziona, come si costruisce, quali file utilizza, come si è configurato, come funziona nel vostro IDE, come è strutturato, quali sono gli strumenti che utilizza, ecc Conversione di una grande base di codice JavaScript per dattiloscritto è molto fattibile quando si sai quello che stai facendo, ma potrebbe essere frustrante quando non lo fai.
Dattiloscritto è open source (Apache 2 con licenza, vedi github ) e sostenuta da Microsoft. Anders Hejlsberg , l'architetto principale di C # sta conducendo il progetto. E 'un progetto molto attivo; il team dattiloscritto è stato rilasciato un sacco di nuove funzionalità negli ultimi anni e un sacco di quelle grandi sono ancora in programma a venire (vedi la tabella di marcia ).
Nel 2017 sondaggio StackOverflow sviluppatore dattiloscritto è stato il più popolare transpiler JavaScript (9 ° posto assoluto) e ha vinto il terzo posto nella categoria linguaggio di programmazione più amato.
Dattiloscritto fa qualcosa di simile a ciò che di meno o sass fa per i CSS. Sono super set di esso, il che significa che ogni codice JS che si scrive è un codice dattiloscritto valido. Inoltre è possibile utilizzare le altre chicche che si aggiunge alla lingua, e il codice transpiled sarà js validi. È anche possibile impostare la versione JS che si desidera che il codice risultante su.
Attualmente dattiloscritto è un super set di ES2015, quindi potrebbe essere una buona scelta per iniziare ad imparare il nuovo js caratteristiche e transpile allo standard necessari per il progetto.
" Dattiloscritto Fundamentals " - un video-corso Pluralsight da Dan Wahlin e John Papa è davvero un buon, attualmente (25 marzo 2016) aggiornato per riflettere dattiloscritto 1.8, introduzione al dattiloscritto.
Per me le davvero buone caratteristiche, accanto alle belle possibilità di IntelliSense, sono le classi , interfacce , moduli , la facilità di implementazione di AMD, e la possibilità di utilizzare il debugger di Visual Studio tipografico quando viene richiamato con IE.
Per riassumere : se utilizzato come previsto, Carattere tipografico può rendere la programmazione JavaScript più affidabile e più facile. Si può aumentare la produttività del programmatore JavaScript in modo significativo su tutta la SDLC.
Ecma Script 5 (ES5), che tutto il supporto del browser e precompilato. ES6 / ES2015 e ES / 2016 è venuto quest'anno con un sacco di modifiche in modo a pop-up questi cambiamenti c'è una via di mezzo che dovrebbe prendere si preoccupa così dattiloscritto. • dattiloscritto è Tipi -> significa che dobbiamo definire il tipo di dati di ogni proprietà e metodi. Se si conosce C # allora tipografico è facile da capire. • Grande vantaggio del dattiloscritto è che tipo di identità relative questioni presto prima di andare in produzione. Questo permette unit test per sicuro se c'è qualche tipo non corrispondente.