Jak se vám produkovat .d.ts „typizace“ Soubor definice z existující knihovny JavaScriptu?

hlasů
127

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?

Položena 02/10/2012 v 10:29
zdroj uživatelem
V jiných jazycích...                            


8 odpovědí

hlasů
168

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.

Odpovězeno 02/10/2012 v 18:11
zdroj uživatelem

hlasů
25

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.

Odpovězeno 04/08/2016 v 00:54
zdroj uživatelem

hlasů
13

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.

Odpovězeno 19/10/2015 v 09:08
zdroj uživatelem

hlasů
10

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.

Odpovězeno 03/10/2012 v 00:02
zdroj uživatelem

hlasů
7

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

Odpovězeno 02/10/2012 v 21:24
zdroj uživatelem

hlasů
2

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.

Odpovězeno 19/08/2016 v 22:44
zdroj uživatelem

hlasů
2

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

Odpovězeno 04/10/2012 v 18:37
zdroj uživatelem

hlasů
0

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)

Odpovězeno 23/09/2019 v 19:24
zdroj uživatelem

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