Můžete mi prosím popsat, co jazyk strojopis?
Co to může dělat, že JavaScript, nebo dostupné knihovny nemohou dělat, že by mi odÛvodnûní?
Můžete mi prosím popsat, co jazyk strojopis?
Co to může dělat, že JavaScript, nebo dostupné knihovny nemohou dělat, že by mi odÛvodnûní?
Původně jsem napsal tuto odpověď, když Typescript byl ještě za tepla off-the-lisy. O pět let později, to je v pořádku přehled, ale podívejte se na Lodewijk odpověď níže pro více do hloubky
Strojopis je nadmnožinou JavaScriptu, které primárně zajišťuje volitelná statické psaní, třídy a rozhraní. Jednou z velkých výhod je umožnit IDE poskytovat bohatší prostředí pro nanášení běžných chyb při psaní kódu .
Chcete-li získat představu o tom, co mám na mysli, sledovat úvodní video společnosti Microsoft na jazyku.
Pro velký projekt JavaScript, přijímání strojopis může mít za následek více robustní software, zatímco ještě je nasazení, kdy by pravidelná aplikace JavaScript spustit.
Je open source, ale dostanete jen chytrý Intellisense při psaní, pokud používáte podporované IDE. Zpočátku to bylo jen Microsoft Visual Studio (také známý v blogu od Miguel de Icaza ). V těchto dnech, další IDE nabízejí podporu strojopisem příliš .
Je tu CoffeeScript , ale ve skutečnosti slouží k jinému účelu. IMHO, CoffeeScript zajišťuje čitelnost pro člověka, ale strojopisem také poskytuje hluboké čitelnost pro nástroje prostřednictvím svého volitelného statické psaní (viz tento nedávný blogový příspěvek o trochu více kritiky). K dispozici je také Dart , ale je to plné nahrazení pro JavaScript (ačkoli to může produkovat kód JavaScriptu )
Jako příklad, tady je nějaký strojopisu (můžete hrát s tím v strojopisu hřiště )
class Greeter {
greeting: string;
constructor (message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
A tady je JavaScript to by produkovalo
var Greeter = (function () {
function Greeter(message) {
this.greeting = message;
}
Greeter.prototype.greet = function () {
return "Hello, " + this.greeting;
};
return Greeter;
})();
Všimněte si, jak strojopisu definuje typ proměnné členů a parametrů metody třídy. To je odstraněn při překládání do JavaScriptu, ale využívá IDE a kompilátor na místě chyby, jako je předávání číselný typ konstruktoru.
Je také schopen odvozovat druhy, které nejsou výslovně deklarovány, například, bylo by to určit greet()metoda vrací řetězec.
Mnoho prohlížečů a IDE nabízejí přímou podporu ladění přes sourcemaps. Viz tento přetečením zásobníku otázku pro další podrobnosti: Ladění strojopisem kód s Visual Studio
Původně jsem napsal tuto odpověď, když Typescript byl ještě za tepla off-the-lisy. Podívejte se na Lodewijk je odpověď na tuto otázku pro některé další aktuální detailu.
I když je přijata odpověď je v pořádku, cítil jsem, že to opravdu nedělá strojopisem spravedlnost v tomto bodě. Není prvních dnů už ne. Strojopis je najít mnohem více přijetí nyní s několika populárních rámců se píše na psacím stroji. Důvody, proč byste měli vybrat strojopis místo JavaScriptu jsou nyní mnoho.
JavaScript je standardizována přes ECMAScript norem. Ne všechny prohlížeče podporující použití všechny funkce novějších ECMAScript standardů (viz tato tabulka ). Strojopisem podporuje nové standardy ECMAScript a zpracovává je na (starší) ECMAScript cílů vašeho výběru (v běžných cíle jsou 3, 5 a 6 [aka 2015]). To znamená, že můžete použít funkce ES2015 i mimo něj, stejně jako moduly, lambda funkce, třídy, operátor spread, rozrušující dnes. To také přidá typ podporu kurzu, který není v žádném standardu ECMAScript a může pravděpodobně nikdy být vzhledem k povaze interpretován namísto kompilované povahy JavaScriptu. Typ Systém strojopis je poměrně bohatá a zahrnuje: rozhraní, výčty, hybridní typy, generické, Union a průsečíků typy, modifikátory přístupu a mnohem více. Oficiální internetové stránky na psacím stroji poskytuje přehled těchto funkcí.
Strojopisem má jedinečnou filozofii ve srovnání s jinými jazyky, které sestavují do JavaScriptu. JavaScriptový kód je platný strojopisem kód; Strojopis je nadmnožinou JavaScriptu. Můžete téměř přejmenování .jssouborů na .tssoubory a začít používat strojopisem. Soubory strojopisem jsou sestaveny tak, aby čitelné JavaScript, takže migrace zpět je možné a porozumění kompilované strojopisem není těžké vůbec. Tímto způsobem strojopisem navazuje na úspěchy JavaScriptu a zároveň zlepšit na své slabiny.
Na jedné straně máte budoucí nástroje, důkaz, že berou moderní ECMAScript standardů a sestavit ji do starších verzí JavaScriptu s Babel je jeden z nejoblíbenějších. Na druhou stranu, máte jazyky, které se mohou zcela lišit od JavaScriptu, které cílí JavaScript, jako Coffeescript, Clojure, Dart, Elm, haXe, ScalaJs, a celá řada více (viz tento seznam ). Tyto jazyky, i když by mohly být lepší, než kdy Budoucí JavaScript je možná někdy vést, existuje vyšší riziko nenalezení dostatek přijetí na jejich budoucnost je třeba zajistit. Ty by mohly mít také větší potíže najít zkušené vývojáře pro některé z těchto jazyků, ale ty, které najdete mohou být často více nadšený. Interop s JavaScriptu může být také trochu více zapojit, protože jsou dále odstraněny z toho, co JavaScript ve skutečnosti je.
Strojopis sedí mezi těmito dvěma extrémy, tak kompenzovat rizika. Strojopisem není riskantní volba žádnou normou. To trvá velmi málo úsilí, aby zvyknout, pokud jste obeznámeni s JavaScriptem, protože není úplně jiný jazyk, má výbornou podporu JavaScriptu interoperability a to vidělo hodně přijetí v poslední době.
JavaScript je dynamicky napsaný. To znamená, že JavaScript neví, jaký typ je proměnná, dokud není ve skutečnosti vytvořena při spuštění. To také znamená, že to může být příliš pozdě. Strojopisem přidává typ podporu JavaScriptu. Chyby, které jsou způsobeny mylných předpokladů nějaké proměnné, která je určitého typu může být úplně odstranit, pokud budete hrát správnými kartami; jak přísné zadání kódu, nebo pokud zadáte svůj kód vůbec je jen na vás.
Strojopisem dělá psaní o něco jednodušší a mnohem méně explicitní o použití typu závěru. Například: var x = "hello"na stroji je stejné jako var x : string = "hello". Typ je jednoduše vyvodit z jeho používání. Dokonce to není explicitně zadat typy, jsou stále tam, aby vás zachránil v tom něco, co by jinak za následek chyby run-time.
Strojopis případně zadali ve výchozím nastavení. Například function divideByTwo(x) { return x / 2 }je platný funkci na stroji, které mohou být volána s jakýmkoliv druhem parametru, přestože volat to s řetězem bude zřejmě mít za následek runtime chyby. Stejně jako jste zvyklí v JavaScriptu. Tato metoda funguje, protože když se žádný typ explicitně zadáno a typu nemohla být vyvozena, stejně jako v příkladu divideByTwo bude strojopisem implicitně přiřadit typ any. To znamená, že typ podpis divideByTwo funkci automaticky stává function divideByTwo(x : any) : any. Tam je kompilátor příznak zakázat toto chování: --noImplicitAny. Aktivace tohoto příznaku vám dává větší míru bezpečnosti, ale také znamená, že budete muset dělat více psaní.
Typy mají náklady spojené s nimi. V prvé řadě je zaučení, a za druhé, samozřejmě, že vás bude stát trochu více času na vytvoření codebase používat správné přísné psát taky. Z vlastní zkušenosti vím, že tyto náklady jsou naprosto stojí za to v případě závažného codebase, který sdílí s ostatními. Ve velkém měřítku studie programovacích jazyků a kvality kódu v GitHub naznačuje, že „že staticky zadávané jazyky jsou obecně méně vada náchylnější než dynamické typy, a to silný psaní je lepší než slabé psaní ve stejné souvislosti“.
Je zajímavé si povšimnout, že tento samý dokument konstatuje, že na psacím stroji je méně náchylné k chybám pak JavaScriptu:
Pro ty, kteří s pozitivními koeficienty můžeme očekávat, že tento jazyk je spojena s, ceteris paribus, většího počtu oprav vad. Tyto jazyky patří C, C ++, JavaScript , Objective-C, PHP, a Python. Jazyky Clojure, Haskell, Ruby, Scala a strojopis , všechny mají negativní koeficienty z čehož vyplývá, že tyto jazyky jsou méně pravděpodobné než průměrná vést k upevnění vada dopustí.
Zkušenosti vývoj s psacím stroji je velké zlepšení přes JavaScript. IDE je informován v reálném čase podle strojopisu kompilátorem na své bohaté informace o typu. To poskytuje několik důležitých výhod. Například s strojopisem můžete bezpečně udělat refaktorování jako přejmenuje napříč celou codebase. Prostřednictvím doplňování kódu můžete získat inline pomoc na cokoliv funguje knihovna by mohla nabídnout. Žádné další nutné pamatovat, nebo je vyhledat v internetových odkazech. Chyby kompilace jsou zachyceny přímo ve vývojovém prostředí s červeným klikatou čarou, když jste zaneprázdněni kódování. Celkově vzato to umožňuje výrazné zvýšení produktivity ve srovnání s práci s JavaScriptem. Jeden může trávit více času kódování a méně času ladění.
K dispozici je široká škála IDE, které mají vynikající podporu pro strojopisu, stejně jako Visual Studio a VS kódu, atomu, Sublime a IntelliJ / WebStorm.
Runtime chyby formě cannot read property 'x' of undefinednebo undefined is not a functionjsou velmi často způsobeny chyby v kódu JavaScriptu. Po vybalení z krabice strojopisu již snižuje pravděpodobnost, že tyto druhy chyb vyskytují, protože nelze použít proměnnou, která není známa strojopisu kompilátor (s výjimkou vlastností anyzadali proměnných). Stále je však možné mylně používat proměnnou, která je nastavena na hodnotu undefined. Nicméně, s verzí 2.0 strojopisu můžete odstranit tyto druhy chyb dohromady přes použití non-nullable typů. Tato metoda funguje takto:
Díky striktním null kontroly povolen ( --strictNullCheckskompilátor příznak) bude strojopisu překladač nedovolí undefinedbýt přiřazena proměnné, pokud explicitně deklarovat to být nullable typu. Například, let x : number = undefinedbude mít za následek chyby kompilace. To dokonale zapadá do teorií typu, protože undefinednení číslo. Jeden může definovat xjako druh suma numbera undefinedopravit toto: let x : number | undefined = undefined.
Jakmile je typ známo, že je s možnou hodnotou Null, což znamená, že je typu, který může být také hodnoty nullnebo undefined, strojopisu kompilátor může určit pomocí ovládacího bázi toků analýzy typu, zda váš kód může bezpečně používat proměnnou, nebo ne. Jinými slovy, při kontrole je proměnná undefinedprostřednictvím například ifprohlášení strojopisu kompilátor bude odvozovat, že typ v této větvi toku řízení váš kód je už ne s možnou hodnotou Null, a proto může být bezpečně používán. Zde je jednoduchý příklad:
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.
Během build 2016 konference spolupráce designéra strojopisu Anders Hejlsberg poskytla podrobné vysvětlení a předvedení tuto funkci: videa (od 44:30 do 56:30).
Chcete-li používat strojopisem budete potřebovat proces sestavení kompilace kódu JavaScriptu. Konstrukční proces obvykle trvá jen několik sekund, samozřejmě v závislosti na velikosti projektu. Strojopisu kompilátor podporuje inkrementální kompilace ( --watchkompilátor příznak) tak, aby všechny jeho následné změny lze sestavit při vyšší rychlosti.
Strojopisu kompilátor inline source satelitních informací vygenerovaných JS soubory nebo vytvořit samostatné .map. Informace mapa zdroj může být použit ladicí nástroje, jako jsou prohlížeče Chrome Devtools a další IDE vztáhnout řádky v JavaScriptu k těm, které je vytvořené ve stroji. To umožňuje nastavit zarážky a kontrolovat proměnných za běhu přímo na psacím stroji kódu. Informační zdroj mapa funguje docela dobře, bylo to ještě dlouho předtím, než strojopisu, ale ladění strojopisem obecně není tak velký jako při použití JavaScript přímo. Take thisklíčové slovo např. Vzhledem ke změněným sémantiku thisklíčového slova kolem uzávěrů od ES2015, thismůže za běhu jako proměnné nazvané skutečně existuje _this(viz tuto odpověď ). To může zmást při ladění, ale obecně není problém, pokud víte o tom, nebo zkontrolovat kód JavaScript. Je třeba poznamenat, že Babel trpí přesně stejný druh problému.
Existuje několik dalších triků strojopisu kompilátor může dělat, jako je generování kódu zachytí na základě dekoratéry , generování modulu kódu načítání různých systémů modulu a analýze JSX . Nicméně, budete pravděpodobně vyžadovat sestavení nástroj kromě strojopisu kompilátoru. Například pokud chcete komprimovat kód budete muset přidat další nástroje na sestavení procesu, aby tak učinily.
K dispozici jsou pro strojopis kompilace plugins WebPack , Culpa , Grunt a skoro žádné jiné JavaScript sestavení nástroj venku. Dokumentace strojopisem má sekci na integraci s nástroji sestavení je všechny pokrývají. Linter je k dispozici také v případě, že byste chtěli ještě doba stavby kontrolu. Tam jsou také velké množství očkovacích projektů tam, že vám pomohou začít s strojopisu v kombinaci s partou dalších technologií, jako jsou rohové 2, reagují, Ember, SystemJs, WebPack, Culp, atd.
Vzhledem k tomu, strojopis je tak úzce souvisí s JavaScriptem, že má skvělé schopnosti v různých prostředích, ale je nutná určitá práce navíc pro práci s knihoven JavaScript na psacím stroji. Definice strojopisem jsou nutné k tomu, aby strojopisem kompilátor chápe, že volání funkce jako _.groupBynebo angular.copynebo $.fadeOutnejsou ve skutečnosti nezákonné prohlášení. Definice pro tyto funkce jsou umístěny v .d.tssouborech.
Nejjednodušší forma definice může trvat je umožnit identifikátor které mají být použity v žádném případě. Například při použití Lodash , soubor definice jediný řádek declare var _ : anyvám umožní volat jakoukoli funkci, kterou chcete na _, ale pak samozřejmě jste také stále schopni dělat chyby: _.foobar()bude právní strojopisu hovor, ale je samozřejmě ilegální volání za běhu. Pokud chcete, podporu správného typu a doplňování kódu je soubor definice musí být přesněji (viz lodash definice pro příklad).
NPM moduly , které přicházejí pre-balené s vlastními definic typu jsou automaticky chápáno strojopisu kompilátorem (viz dokumentace ). Pro skoro žádné jiné semi-populární knihovny JavaScriptu, který neobsahuje vlastní definice někoho tam již je definice typu jsou k dispozici prostřednictvím jiného NPM modulu. Tyto moduly jsou s předponou „@ typy /“ a pocházejí z úložiště GitHub zvané DefinitelyTyped .
Je zde jeden háček: definice typu musí odpovídat verzi knihovny, kterou používáte při spuštění. Pokud tak neučiní, může být strojopisem vám znemožní z volání funkce nebo dereferencing proměnné, které existují, nebo vám umožní volání funkce nebo dereference proměnnou, která neexistuje, jednoduše proto, že typy neodpovídají run-time při kompilaci , Takže ujistěte se, že jste vložili správnou verzi definic typu pro správnou verzi knihovny, kterou používáte.
Chcete-li být upřímný, tam je nepatrný hádka to a to může být jeden z důvodů, proč si nevyberete strojopisu, ale místo toho jít na něco takového Babel, které netrpí museli dostat definice typu vůbec. Na druhou stranu, pokud víte, co děláte, můžete snadno překonat jakýkoli druh problémů způsobených nesprávné nebo chybějící definičních souborů.
Jakýkoli .jssoubor může být přejmenován na A .tsa běžel přes strojopisu kompilátor dostat syntakticky stejný kód JavaScriptu jako výstup (pokud je to syntakticky správně na prvním místě). I když je strojopis kompilátor dostane chyby kompilace bude stále produkovat .jssoubor. To může dokonce přijímat .jssoubory jako vstup s --allowJsvlajkou. To vám umožní začít s strojopisem hned. Bohužel k chybám kompilace je pravděpodobnější na začátku. Člověk je třeba si uvědomit, že tyto nejsou show-zastavení chyby jako vy může být použit k s jinými kompilátory.
Chyby kompilace, kdo dostane na začátku při převodu projektu JavaScriptu na psacím stroji projektu jsou nevyhnutelných strojopisem přirozenosti. Strojopisem kontroluje veškerý kód pro platnosti, a proto je třeba vědět o všem funkcím a proměnných, které jsou používány. Tedy definice typu musí být na svém místě pro všechny z nich jinak kompilace chyby jsou povinni nastat. Jak již bylo zmíněno v kapitole výše, pro skoro jakýkoli rámcem pro JavaScript existují .d.tssoubory, které mohou být snadno nabytých s instalací DefinitelyTyped balíčků . Mohlo by se však stát, že jste použili nějaký obskurní knihovny, pro které jsou k dispozici žádné definice stroji nebo že jste polyfilled některé JavaScript primitiva. V takovém případě je třeba zadat typ definice pro tyto kousky, aby byly tyto chyby kompilace do vo. Stačí vytvořit .d.tssoubor a zahrnout do tsconfig.json v filespoli, takže je vždy zvažováno strojopisu kompilátorem. V něm prohlásit ty kousky, které strojopisem neví jako typ any. Poté, co jste odstraněny všechny chyby, můžete postupně zavádět psaní těm částem podle svých potřeb.
Bude také potřeba nějaká práce na (re) Konfigurace vašeho sestavení potrubí dostat strojopis do výstavby plynovodu. Jak již bylo zmíněno v kapitole o sestavování existuje spousta dobrých zdrojů tam a doporučujeme vám podívat se na sadbu projekty, které využívají kombinace nástrojů, které chcete pracovat s.
Největší překážkou je křivka učení. Povzbuzuji vás, hrát si s malým projektem na prvním místě. Podívejte se, jak to funguje, jak se staví, které soubory používá, jak je nastaven, jak to funguje v IDE, jak je strukturován tak, jaké nástroje, kterou používá, atd Převod velké JavaScript codebase na psacím stroji je velmi uskutečnitelný, když vás víte, co děláte, ale to může být frustrující, když nemáte.
Strojopis je open source (Apache 2 licencí, viz GitHub ) a podporované společností Microsoft. Anders Hejlsberg , vedoucí architekt C # je v čele projektu. Je to velmi aktivní projekt; strojopisu tým byl uvolňuje velké množství nových funkcí v posledních několika letech a spousta skvělých ty jsou stále v plánu přijít (viz plán ).
V 2017 StackOverflow developer průzkumu strojopisu byl nejpopulárnější transpiler JavaScript (9. místo absolutně) a získal třetí místo v kategorii nejvíce miloval programovacího jazyka.
Strojopisem dělá něco podobného, co méně nebo Sass dělá pro CSS. Jsou flash sady ní, což znamená, že každý kód JS píšete platí strojopisem kód. Navíc můžete použít jiné dobroty, že se přidá k jazyku, a transpiled kód bude platný js. Můžete dokonce nastavit verzi JS, že chcete, aby vaše výsledný kód na.
V současné době strojopis je super sada ES2015, takže by mohl být dobrou volbou začít se učit nový js funkce a transpile na potřebnou normu pro váš projekt.
„ Strojopis Základy “ - A Pluralsight video kurs Dan Wahlin a John Papa je opravdu dobrý, v současné době (25.března 2016) aktualizovány tak, aby odrážely strojopisu 1.8, úvod do strojopisem.
Pro mě je opravdu dobré vlastnosti, vedle krásných možností IntelliSense, jsou třídy , rozhraní , moduly , snadnost implementace AMD, a možnost použít ladicí program Visual Studio strojopisem při vyvolání s IE.
Abychom to shrnuli : Je-li používán k určenému účelu, Typescript může programování JavaScript spolehlivější a jednodušší. To může zvýšit produktivitu programátora JavaScript výrazně nad plnou SDLC.
ECMA 5 (ES5), které podporují všechny prohlížeče a předkompilována. ES6 / ES2015 a ES / 2016 přišel tento rok se spoustou změn tak, aby pop-up těchto změn je něco mezi tím, který by měl mít starosti o tak stroji. • strojopis Druhy -> znamená, že musíme definovat datový typ každé vlastnosti a metody. Pokud víte, C # a pak Typescript je snadné pochopit. • Velkou výhodou je, že jsme strojopisem identity Type problémů souvisejících brzy před odchodem do výroby. To umožňuje unit testy k nezdaru, pokud existuje neshoda typu.