Já používám hodně knihoven i můj vlastní i třetí strany. Vidím, že „typizace“ adresář obsahuje některé pro jQuery a WinRT ... ale jak jsou vytvořeny?
Jak se vám produkovat .d.ts „typizace“ Soubor definice z existující knihovny JavaScriptu?
Tam jsou k dispozici pro vás v závislosti na knihovně v otázce, jak je to napsáno několik možností, a na jaké úrovni přesnosti, které hledáte. Podívejme se na možnosti, ve zhruba sestupném pořadí podle vhodnosti.
Možná, že již existuje
Vždy zkontrolujte, zda DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) jako první. Jedná se o obec repo plná doslova tisíce .d.ts souborů a je velmi pravděpodobné, že věc, kterou používáte, je už tam. Měli byste také zkontrolovat TypeSearch ( https://microsoft.github.io/TypeSearch/ ), což je vyhledávač pro NPM-publikoval .d.ts souborů; to bude mít o něco více než definice DefinitelyTyped. Několik moduly jsou také lodní své vlastní definice jako součást jejich distribuce NPM, tak také zjistit, jestli je to ten případ, než se snaží psát své vlastní.
Možná jste to nepotřebují
Strojopisem nyní podporuje --allowJsvlajku a učiní další závěry JS založené na JS souborů. Můžete zkusit včetně JS soubor do kompilace spolu s --allowJsnastavením, aby zjistil, jestli to vám dává dostatek dobré informace o typu. Strojopisem pozná věci jako tříd ES5 stylu a JSDoc komentáře v těchto souborů, ale může dojít k zakopl pokud knihovna inicializuje v podivné cestě.
Začínáme s --allowJs
Pokud --allowJsvám dal slušné výsledky a chcete psát lepší definice soubor sami, můžete kombinovat --allowJss --declarationvidět strojopis je „nejlepší odhad“ na typy knihovny. To vám dá slušnou výchozí bod, a může být stejně dobrý jako soubor ručně napsaný, pokud jsou dobře napsané, že JSDoc komentáře a kompilátor byl schopen najít.
Začínáme s DTS-gen
Kdyby --allowJsnefungoval, možná budete chtít použít DTS-gen ( https://github.com/Microsoft/dts-gen ), aby jako výchozí bod. Tento nástroj používá tvar runtime objektu přesně vyjmenovat všechny dostupné vlastnosti. Na druhou stranu to má tendenci být velmi přesné, ale nástroj zatím nepodporuje škrábání JSDoc připomínky k naplnění další typy. Je-li spustit toto třeba takto:
npm install -g dts-gen
dts-gen -m <your-module>
To bude generovat your-module.d.tsv aktuálním adresáři.
Zamáčknout
Pokud si jen chcete, aby to všechno později a odejít, aniž by typů chvíli vás, na psacím stroji 2.0 můžete nyní psát
declare module "foo";
která vám umožní importna "foo"modul s typem any. Pokud jste globální chcete zabývat později, stačí napsat
declare const foo: any;
který vám dá fooproměnnou.
Můžete použít buď tsc --declaration fileName.tsjako Ryan popisuje, nebo můžete zadat declaration: truepod compilerOptionsve vašem tsconfig.jsonza předpokladu, že jste již měli tsconfig.jsonv rámci projektu.
Nejlepší způsob, jak se vypořádat s tím (v případě, že soubor prohlášení není k dispozici DefinitelyTyped ) je napsat prohlášení pouze na věci, které používají spíše než celé knihovně. Tím se snižuje hodně pracovat - a navíc překladač je tam na pomoc ze strany stěžují na chybějící metod.
Jak říká Ryan, TSC kompilátor má přepínač, --declarationkterý generuje .d.tssoubor ze .tssouboru. Také si všimněte, že (kromě chyby) strojopis měl být schopen sestavit Javascript, takže si můžete projít stávající javascript kód do TSC kompilátoru.
jak je popsáno v http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript ve 00:33:52 že stavěl nástroj pro konverzi WebIDL a WinRT metadata do strojopisem d.ts
Zde je několik PowerShell, který vytvoří soubor jednotnou definici strojopisem knihovna, která obsahuje několik *.jssouborů s moderním JavaScriptu.
Za prvé, změnit všechny prodlužovat .ts.
Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }
Za druhé, použití strojopisu kompilátor generovat definičních souborů. Tam bude parta chyby kompilátoru, ale můžeme ignorovat ty.
Get-ChildItem | foreach { tsc $_.Name }
A konečně, po sečtení všech *.d.tssouborů do jednoho index.d.ts, odstraněním importprohlášení a odstranění defaultz každé vývozní prohlášení.
Remove-Item index.d.ts;
Get-ChildItem -Path *.d.ts -Exclude "Index.d.ts" | `
foreach { Get-Content $_ } | `
where { !$_.ToString().StartsWith("import") } | `
foreach { $_.Replace("export default", "export") } | `
foreach { Add-Content index.d.ts $_ }
To končí jediného použitelného index.d.tssouboru, který zahrnuje mnoho definic.
To bych se na existující mapování vašich třetí strany JS knihovnami, které podporují Script # nebo SharpKit. Uživatelé těchto C # JS přes kompilátory bude čelí problému nyní čelit a mohla zveřejnil open source program pro skenování 3. lib stran a jejich převedení do kostra C # tříd. Pokud tomu tak je hack program skeneru generovat strojopisu místo C #.
Pokud to není možné, překládání C # veřejné rozhraní pro 3. strany lib do definice strojopisem by mohlo být jednodušší, než to samé čtením zdroje JavaScriptu.
Můj zvláštní zájem je ExtJS RIA framework Sencha a vím, že tam byly projekty zveřejněny generovat C # interpretaci pro Script # nebo SharpKit
Při vytváření vlastní knihovnu, můžete si vytvořit *.d.tssoubory pomocí tscpříkazu (strojopis Compiler) jako tak: (za předpokladu, že jste budování své knihovny do dist/libsložky)
tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
-d(--declaration) Generuje*.d.tssoubory--declarationDir dist/lib: Výstupní adresář pro generované prohlášení soubory.--declarationMap: Generuje sourcemap pro každý odpovídající soubor‘.d.ts.--emitDeclarationOnly: Jen vydávat deklarace soubory‘.d.ts. (Ne zkompilovaný JS)
(viz dokumenty pro všechny možnosti příkazového řádku kompilátoru)
Nebo například ve vaší package.json:
"scripts": {
"build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}
a pak spustit: yarn build:types(a npm run build:types)













