Qu'est-ce que le texte dactylographié et pourquoi l'utiliserais-je à la place du JavaScript? [fermé]

pouvez-vous décrire ce qu'est le langage dactylographié?

que peut-il faire que JavaScript ou les bibliothèques disponibles ne peuvent pas faire, qui me donneraient raison de l'envisager?

1330
demandé sur ganders 2012-10-02 20:37:58

5 réponses

j'ai écrit cette réponse à L'origine alors que le manuscrit était encore chaud-presses. Cinq ans plus tard, c'est une bonne vue d'ensemble, mais regardez Lodewijk de réponse ci-dessous pour plus de profondeur

vue de 1000pi...

TypeScript est un sur-Ensemble de JavaScript qui fournit principalement la dactylographie statique facultative, les classes et les interfaces. Un des grands avantages est de permettre à IDEs pour fournir un environnement plus riche pour repérer les erreurs communes comme vous tapez le code .

pour avoir une idée de ce que je veux dire, regardez la vidéo d'introduction de Microsoft sur la langue.

pour un grand projet JavaScript, l'adoption de TypeScript pourrait se traduire par un logiciel plus robuste, tout en restant déployable là où une application JavaScript régulière serait exécutée.

C'est open source, mais vous n'utilisez L'intelligent Intellisense que si vous utilisez un IDE pris en charge. Au départ, il s'agissait uniquement du studio visuel de Microsoft (également noté dans le billet de blog de Miguel de Icaza ). Ces jours-ci, d'autres IDEs offrent un support de typographie aussi .

il existe d'autres technologies comme ça?

il y a CoffeeScript , mais cela sert vraiment un but différent. IMHO, CoffeeScript fournit lisibilité pour les humains, mais le Typographie fournit également une lisibilité approfondie pour outils par le biais de son Dactylographie statique facultative (voir ce récent billet de blog pour un peu plus de critique). Il y a aussi Dart mais c'est un complet sur le remplacement de JavaScript (bien que cela peut produire le code JavaScript )

exemple

à titre d'exemple, voici quelques caractères typographiques (vous pouvez jouer avec cela dans le jeu de caractères )

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

et voici le JavaScript qu'il produirait

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

remarquez comment le TypeScript définit le type de variables membres et les paramètres de la méthode de classe. Ceci est supprimé lors de la traduction en JavaScript, mais utilisé par L'IDE et le compilateur pour repérer les erreurs, comme passer un type numérique au constructeur.

il est aussi capable de déduire types qui ne sont pas explicitement déclarés, par exemple, il déterminerait la méthode greet() renvoie une chaîne.

Débogage Dactylographié

de nombreux navigateurs et IDEs offrent un support de débogage direct via sourcemaps. Voir cette question pour plus de détails: déboguer le code dactylographié avec Visual Studio

voulez-vous en savoir plus?

j'ai écrit cette réponse à l'origine quand Tapuscrit était encore chaud-hors-la-presses. Consultez la réponse de Lodewijk à cette question pour plus de détails.

1063
répondu Paul Dixon 2018-06-06 20:06:35

bien que la réponse acceptée soit bonne, j'ai senti qu'il ne fait pas vraiment justice dactylographier à ce point. Ce n'est pas les premiers jours de plus. La typographie est de plus en plus répandue, plusieurs cadres populaires étant écrits en typographie. Les raisons pour lesquelles vous devriez choisir le format de caractères plutôt que le JavaScript sont nombreuses maintenant.

Rapport à JavaScript

Tapuscrit est moderne JavaScript + types. Il s'agit d'attraper les insectes tôt et en faisant de vous un développeur plus efficace, tout en tirant parti de la communauté JavaScript.

JavaScript est standardisé par les normes ECMAScript. Les navigateurs plus anciens ne prennent pas en charge toutes les fonctionnalités des nouvelles normes ECMAScript (voir ce table ). TypeScript prend en charge les nouvelles normes ECMAScript et les compile vers les cibles (plus anciennes) ECMAScript de votre choix (les cibles actuelles sont 3, 5 et 6 [a. K. A. 2015]). Cela signifie que vous pouvez utiliser les caractéristiques de ES2015 et au-delà, comme les modules, les fonctions lambda, les classes, l'opérateur de propagation et de destruction, tout en restant rétro compatible avec les navigateurs plus anciens.

la prise en charge de type ne fait pas partie de la norme ECMAScript et peut probablement ne jamais être due à la nature interprétée au lieu de la nature compilée de JavaScript. Le système de caractères typographiques est incroyablement riche et comprend: interfaces, enums, types hybrides, génériques, types Union / intersection, modificateurs d'accès et bien plus encore. Le site officiel de Dactylographie donne un aperçu de ces caractéristiques. Le système de type de typographie est aujourd'hui à la hauteur d'autres langages dactylographiés et, dans certains cas, plus puissant.

Rapport à d'autres JavaScript ciblage des langues

dactylographié a une philosophie unique par rapport à d'autres langues qui compilent à JavaScript. Le code JavaScript est un code typographique valide; le code typographique est un ensemble de JavaScript. Vous pouvez presque renommer vos fichiers .js en fichiers .ts et commencer à utiliser le format dactylographié (voir "interopérabilité JavaScript" ci-dessous). Les fichiers dactylographiés sont compilés en JavaScript lisible, de sorte que la migration de retour est possible et la compréhension de L'écriture dactylographiée compilée n'est pas difficile du tout. TypeScript s'appuie sur les succès de JavaScript tout en améliorant ses faiblesses.

d'un côté, vous avez de futurs outils de preuve qui prennent ECMAScript moderne les normes et les compiler vers les anciennes versions JavaScript avec Babel étant le plus populaire. D'autre part, vous avez des langues qui peuvent totalement différer de JavaScript qui ciblent JavaScript, comme Coffeescript, Clojure, Dart, Elm, Haxe, ScalaJs, et un hôte entier plus (voir cette liste ). Ces langues, bien qu'elles puissent être meilleures que là où L'avenir de JavaScript pourrait conduire, courent un plus grand risque de ne pas trouver assez d'adoption pour que leur avenir soit garantir. Vous pourriez également avoir plus de difficulté à trouver des développeurs expérimentés pour certaines de ces langues, bien que celles que vous trouverez peuvent souvent être plus enthousiastes. Interop avec JavaScript peut également être un peu plus impliqué, car ils sont plus éloignés de ce que JavaScript est réellement.

dactylographié se situe entre ces deux extrêmes, équilibrant ainsi le risque. Tapuscrit est pas un choix risqué. Il prend très peu d'efforts pour s'habituer à si vous familier avec JavaScript, puisqu'il n'est pas un langage complètement différent, a un excellent support d'interopérabilité JavaScript et il a vu beaucoup d'adoption récemment.

Éventuellement le typage statique et l'inférence de type

JavaScript est dactylographié dynamiquement. Cela signifie que JavaScript ne sait pas quel type est une variable jusqu'à ce qu'elle soit réellement instanciée à l'exécution. Cela signifie également qu'il peut être trop tard. TypeScript ajoute le support de type à JavaScript. Les bogues qui sont causés par de fausses suppositions d'une variable d'un certain type peuvent être complètement éradiqués si vous jouez vos cartes correctement (comment strict vous tapez votre code ou si vous tapez votre code du tout est à vous).

dactylographié rend la dactylographie un peu plus facile et beaucoup moins explicite par l'utilisation de l'inférence de type. Par exemple: var x = "hello" en caractères typographiques est le même que var x : string = "hello" . Le type est simplement déduit de son utilisation. Même si vous ne tapez pas explicitement types, ils sont toujours là pour vous sauver de faire quelque chose qui, autrement, résulterait en une erreur d'exécution.

dactylographié en option par défaut. Par exemple function divideByTwo(x) { return x / 2 } est une fonction valide en TypeScript qui peut être appelée avec n'importe quel type de paramètre , même si l'appeler avec une chaîne de caractères entraînera évidemment une erreur runtime . Tout comme vous êtes habitués au JavaScript. Cela fonctionne, parce que lorsque aucun le type a été explicitement assigné et le type ne pouvait pas être déduit, comme dans l'exemple de divisebytwo, TypeScript assignera implicitement le type any . Cela signifie que la signature de type de la fonction de divisebytwo devient automatiquement function divideByTwo(x : any) : any . Il y a un drapeau de compilateur pour rejeter ce comportement: --noImplicitAny . Activer ce drapeau vous donne un plus grand degré de sécurité, mais aussi signifie que vous devrez faire plus de Dactylographie.

Les Types

ont un coût qui leur est associé. D'abord tout ce qu'il ya une courbe d'apprentissage, et deuxièmement, bien sûr, il vous coûtera un peu plus de temps pour mettre en place une base de code en utilisant la frappe stricte appropriée aussi. D'après mon expérience, ces coûts en valent la peine pour toute base de données sérieuse que vous partagez avec d'autres. une étude à grande échelle des langages de programmation et de la qualité du Code dans github suggère que " que les langages statiquement typés en général sont moins sujets à des défauts que les types dynamiques, et que la forte dactylographie est mieux qu'une faible dactylographie dans le même sens".

il est intéressant de noter que ce même papier trouve que le dactylogramme est moins sujet aux erreurs que le JavaScript:

pour ceux qui ont des coefficients positifs, nous pouvons nous attendre à ce que la langue est associé à, ceteris paribus, un plus grand nombre de corrections de défauts. Ces langages incluent C, C++, JavaScript , Objective-C, Php, et Python. Le langues Clojure, Haskell, Ruby, Scala, et Tapuscrit , tous ont des coefficients négatifs ce qui implique que ces langues sont moins susceptibles que la moyenne d'entraîner un défaut de fixation s'engage.

Enhanced IDE support

l'expérience de développement avec TypeScript est une grande amélioration par rapport à JavaScript. L'IDE est informé en temps réel par le compilateur TypeScript sur sa riche information de type. Cela donne un couple de grands avantages. Par exemple, avec TypeScript, vous pouvez sans risque faire des remaniements comme renommer sur toute votre base de code. Grâce à l'achèvement de code, vous pouvez obtenir de l'aide en ligne sur toutes les fonctions qu'une bibliothèque pourrait offrir. Plus besoin de se souvenir d'eux ou de les chercher dans les références en ligne. Les erreurs de Compilation sont rapportées directement dans L'IDE avec une ligne squiggly rouge pendant que vous êtes en train de coder. Dans l'ensemble, cela permet un gain de productivité significatif par rapport au travail avec JavaScript. Un de passer plus de temps à coder et moins de temps de débogage.

il existe une large gamme D'IDEs qui ont un excellent support pour le typographie, comme Visual Studio Code, WebStorm, Atom et Sublime.

contrôles nuls stricts

Les erreurs D'exécution

du formulaire cannot read property 'x' of undefined ou undefined is not a function sont très souvent causées par des bogues dans le code JavaScript. Les caractères typographiques réduisent déjà la probabilité de ce genre d'erreurs, puisque on ne peut pas utiliser une variable qui n'est pas connue du compilateur TypeScript (à l'exception des propriétés des variables dactylographiées any ). Il est encore possible cependant d'utiliser par erreur une variable qui est fixée à undefined . Cependant, avec la version 2.0 de TypeScript, vous pouvez éliminer ces types d'erreurs par l'utilisation de types Non-nullables. Cela fonctionne comme suit:

avec les vérifications nulles strictes activées (drapeau --strictNullChecks compilateur) le Le compilateur TypeScript ne permettra pas d'attribuer undefined à une variable à moins que vous ne la déclariez explicitement de type nul. Par exemple, let x : number = undefined entraînera une erreur de compilation. Cela correspond parfaitement à la théorie des types, puisque undefined n'est pas un nombre. On peut définir x comme un type de somme de number et undefined pour corriger ceci: let x : number | undefined = undefined .

une Fois qu'un type est connu pour être nullable, c'est à dire d'un type qui peut aussi être de la valeur null ou undefined , le compilateur TypeScript peut déterminer par l'analyse de type basée sur le flux de contrôle si votre code peut utiliser une variable en toute sécurité ou non. En d'autres termes, lorsque vous cochez une variable est undefined à travers par exemple une déclaration if le compilateur dactylographié déduira que le type dans cette branche du flux de contrôle de votre code n'est plus nul et peut donc être utilisé en toute sécurité. Voici un exemple simple:

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.

lors de la conférence build 2016 co-designer of TypeScript Anders Hejlsberg a donné une explication détaillée et une démonstration de cette fonctionnalité: vidéo (de 44:30 à 56:30).

Compilation

pour utiliser TypeScript, vous avez besoin d'un processus de compilation pour compiler le code JavaScript. Le processus de génération prend généralement que quelques secondes en fonction bien sûr de la taille de votre projet. Le compilateur TypeScript supporte compilation incrémentale (drapeau --watch compilateur), de sorte que toutes les modifications subséquentes peuvent être compilées à une plus grande vitesse.

le compilateur TypeScript peut inline source map information dans le produit.fichiers js ou créer séparément .les fichiers de mappage. Les informations de la carte Source peuvent être utilisées en déboguant des utilitaires comme les DevTools de Chrome et d'autres IDE pour relier les lignes dans le JavaScript à celles qui les ont générées dans le TypeScript. Cela rend possible pour vous de mettre points de rupture et inspectez les variables pendant l'exécution directement sur votre code dactylographié. Les informations de la carte Source fonctionnent assez bien, c'était bien avant le script, mais déboguer le script N'est généralement pas aussi important que Lorsqu'on utilise JavaScript directement. Prenez le mot-clé this par exemple. En raison de la sémantique modifiée du mot-clé this autour des fermetures depuis ES2015, this peut réellement exister pendant l'exécution comme une variable appelée _this (voir ce réponse ). Cela peut vous embrouiller pendant le débogage, mais en général ce n'est pas un problème si vous êtes au courant ou si vous inspectez le code JavaScript. Il convient de noter que Babel souffre exactement le même type de problème.

il y a quelques autres trucs que le compilateur peut faire, comme générer du code d'interception basé sur decorators , générer du code de chargement de modules pour différents systèmes de modules et Parser JSX . Cependant, vous aurez probablement besoin d'un outil de compilation en plus du compilateur dactylographié. Par exemple, si vous souhaitez compresser votre code, vous devrez ajouter d'autres outils à votre processus de génération de le faire.

il y a des plugins de compilation de type TypeScript disponibles pour Webpack , Gulp , Grunt et à peu près n'importe quel autre outil de construction JavaScript là-bas. La documentation dactylographiée comporte une section sur intégration avec les outils de construction de couvrant tous. Un linter est également disponible au cas où vous souhaiteriez encore plus de vérification du temps de construction. Il y a aussi un grand nombre de projets seed là-bas qui vous permettront de commencer avec TypeScript en combinaison avec un tas d'autres technologies comme Angular 2, React, Ember, SystemJs, WebPack, Gulp, etc.

interopérabilité JavaScript

Depuis Le Manuscrit est si étroitement lié à JavaScript qu'il a de grandes capacités d'interopérabilité, mais un peu plus de travail est nécessaire pour travailler avec les bibliothèques JavaScript en Dactylographie. les définitions TypeScript sont nécessaires pour que le compilateur TypeScript comprenne que les appels de fonction comme _.groupBy ou angular.copy ou $.fadeOut ne sont pas en fait des déclarations illégales. Les définitions de ces fonctions sont placées dans les fichiers .d.ts .

le plus simple la forme que peut prendre une définition est de permettre l'utilisation d'un identificateur de quelque manière que ce soit. Par exemple , lors de l'utilisation de Lodash , un fichier de définition de ligne unique declare var _ : any vous permettra d'appeler n'importe quelle fonction que vous voulez sur _ , mais alors bien sûr, vous êtes encore en mesure de faire des erreurs: _.foobar() serait un appel dactylographié légal, mais est bien sûr un appel illégal à l'exécution. Si vous voulez le soutien de type approprié et l'achèvement de code votre dossier de définition doit être plus exact (voir lodash définitions de pour un exemple).

modules Npm qui sont préemballés avec leurs propres définitions de type sont automatiquement compris par le compilateur de caractères (voir documentation ). Pour à peu près n'importe quelle autre bibliothèque JavaScript semi-populaire qui n'inclut pas ses propres définitions quelqu'un là-bas a déjà rendu les définitions de type disponibles par un autre module npm. Ces modules sont préfixés avec " @types / "et proviennent d'un dépôt Github appelé DefinitelyTyped .

il y a une mise en garde: les définitions de type doivent correspondre à la version de la bibliothèque que vous utilisez à l'exécution. S'ils ne le font pas, Tapescript pourrait vous interdire d'appeler une fonction ou déréférencier une variable qui existe ou vous permettre d'appeler une fonction ou déréférence une variable qui n'existe pas, simplement parce que les types ne correspondent pas aux au moment de l'exécution au moment de la compilation. Donc, assurez-vous de charger la bonne version des définitions de type de la bonne version de la bibliothèque que vous utilisez.

pour être honnête, il y a un léger tracas à cela et cela peut être l'une des raisons pour lesquelles vous ne choisissez pas le script, mais optez plutôt pour quelque chose comme Babel qui ne souffre pas d'avoir à obtenir des définitions de type du tout. D'autre part, si vous savez ce que vous faites, vous pouvez facilement surmonter toute sorte de problèmes causés par fichiers de définition incorrects ou manquants.

conversion de JavaScript en TypeScript

tout fichier .js peut être renommé en .ts et passé à travers le compilateur TypeScript pour obtenir syntaxiquement le même code JavaScript comme une sortie (si elle était syntaxiquement correcte en premier lieu). Même si le compilateur dactylographié obtient des erreurs de compilation, il produira quand même un fichier .js . Il peut même accepter des fichiers .js comme entrée avec le drapeau --allowJs . Cela vous permet de commencer avec le texte dactylographié tout de suite. Malheureusement, des erreurs de compilation sont susceptibles de se produire au début. Il ne faut pas oublier que ce ne sont pas des erreurs d'arrêt d'exposition comme vous pouvez être utilisé avec d'autres compilateurs.

les erreurs de compilation que l'on obtient au début lors de la conversion D'un projet JavaScript en un projet TypeScript sont inévitables par la nature de TypeScript. Contrôle dactylographique tous code pour la validité et donc il a besoin de connaître toutes les fonctions et variables qui sont utilisées. Ainsi, les définitions de type doivent être en place pour chacune d'elles, sinon des erreurs de compilation sont susceptibles de se produire. Comme mentionné dans le chapitre ci-dessus, pour à peu près n'importe quel cadre JavaScript, il y a des fichiers .d.ts qui peuvent facilement être acquis avec l'installation de paquets définis . Il se peut cependant que vous ayez utilisé une bibliothèque obscure pour laquelle il n'y a pas de texte dactylographié. des définitions sont disponibles ou que vous avez rempli des primitives JavaScript. Dans ce cas, vous devez fournir des définitions de type pour ces bits afin que les erreurs de compilation se dissolvent. Il suffit de créer un fichier .d.ts et de l'inclure dans la tsconfig.le tableau files de json, de sorte qu'il est toujours considéré par le compilateur dactylographié. Dans ce déclarer ces bits que le manuscrit dactylographié ne connaît pas comme le type any . Une fois que vous avez éliminé toutes les erreurs, vous pouvez introduire progressivement la dactylographie pour les parties en fonction de vos besoins.

un peu de travail sur la (re)configuration de votre pipeline de construction sera également nécessaire pour obtenir le code typographique dans le pipeline de construction. Comme mentionné dans le chapitre sur la compilation il y a beaucoup de bonnes ressources là-bas et je vous encourage à chercher des projets seed qui utilisent la combinaison d'outils que vous voulez travailler avec.

Le plus grand obstacle est la courbe d'apprentissage. Je vous encourage à jouer avec un petit projet à première. Regardez comment il fonctionne, comment il construit, les fichiers qu'il utilise, comment il est configuré, comment il fonctionne dans votre IDE, comment il est structuré, les outils qu'elle utilise, etc. La conversion D'une grande base de codes JavaScript en langage TypeScript est faisable lorsque vous savez ce que vous faites. Lisez ce blog par exemple sur conversion d'une ligne de 600k à dactylographier en 72 heures ). Assurez-vous d'avoir une bonne maîtrise de la langue avant de faire le saut.

Adoption

Tapuscrit est open source (sous licence Apache 2, voir github ) et soutenu par Microsoft. Anders Hejlsberg , l'architecte en chef de C# est le fer de lance du projet. C'est un projet très actif; L'équipe de typographie a publié beaucoup de nouvelles fonctionnalités au cours des dernières années et beaucoup de bonnes sont encore prévues pour venir (voir la feuille de route ).

dans le 2017 StackOverflow développeur de l'enquête Tapuscrit a été le plus populaire JavaScript transpiler (9e place au classement général) et a remporté la troisième place dans le plus aimé de programmation de catégorie a de langue.

768
répondu Lodewijk Bogaards 2018-09-11 07:59:52

Tapuscrit fait quelque chose de semblable à ce que de moins en moins ou sass ne l'est pour le CSS. Ce sont des super-ensembles de celui-ci, ce qui signifie que chaque code JS que vous écrivez est le code dactylographié valide. De plus, vous pouvez utiliser les autres goodies qu'il ajoute à la langue, et le code transpilé sera js valide. Vous pouvez même paramétrer la version JS sur laquelle vous voulez votre code résultant.

actuellement dactylographié est un super ensemble de ES2015, donc pourrait être un bon choix pour commencer à apprendre les nouvelles fonctionnalités js et transpil à la norme nécessaire pour votre projet.

59
répondu lebobbi 2017-02-21 15:28:56

" Tapuscrit Fondamentaux " -- un Pluralsight vidéo cours de Dan Wahlin et John Papa est un très bon, actuellement, 25 Mars 2016) mis à jour pour refléter Tapuscrit 1.8, l'introduction de la Machine.

pour moi les caractéristiques vraiment bonnes, à côté des belles possibilités pour intellisense, sont les classes , interfaces , modules , la facilité d'implémentation de AMD, et la possibilité d'utiliser le débogueur Visual Studio Typescript lorsqu'il est invoqué avec IE.

pour résumer : si utilisé comme prévu, dactylographié peut rendre la programmation JavaScript plus fiable, et plus facile. Il peut augmenter la productivité du programmeur JavaScript de manière significative sur L'ensemble du SDLC.

33
répondu Dimitre Novatchev 2016-05-04 22:54:10

ECMA script 5 (ES5) que tous les navigateurs prennent en charge et précompilé. ES6 / ES2015 et ES / 2016 est venu cette année avec beaucoup de changements donc pour pop up ces changements il ya quelque chose entre qui devrait prendre se soucie de si dactylographié.

• Tapuscrit est Types -> Signifie que nous devons définir le type de données de chaque propriété et des méthodes. Si vous connaissez C#, alors Tapescript est facile à comprendre.

"151900920 • * le grand avantage de L'écriture typographique est-ce que nous avons des problèmes liés au type d'identité au début, avant d'aller en production. Cela permet aux tests unitaires de échouer s'il y a une inadéquation de type.

9
répondu Mayank Jain 2018-10-01 22:26:21