Jak można produkować .d.ts „typowania” plik definicja z istniejącej biblioteki JavaScript?

głosy
127

Używam dużo bibliotek zarówno moje własne i 3rd party. Widzę katalog „typowania” zawiera niektóre z jQuery i WinRT ... ale w jaki sposób są one tworzone?

Utwórz 02/10/2012 o 08:29
źródło użytkownik
W innych językach...                            


8 odpowiedzi

głosy
168

Istnieje kilka dostępnych dla Ciebie w zależności od biblioteki w pytanie, jak to jest napisane opcje i jaki poziom dokładności których szukasz. Spójrzmy na opcje, w przybliżeniu kolejności malejącej pożądane.

Może ona już istnieje

Zawsze należy sprawdzić DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) pierwsza. Jest to repo społeczność pełen dosłownie tysiące plików .d.ts i jest bardzo prawdopodobne, że sprawa używasz już tam jest. Należy również sprawdzić TypeSearch ( https://microsoft.github.io/TypeSearch/ ), która jest wyszukiwarką dla NPM-opublikowany .d.ts plików; będzie to miało nieco więcej niż DefinitelyTyped definicje. Kilka moduły są również wysyłać własne definicje jako część ich dystrybucji NPM, więc również sprawdzić, czy to przypadek, zanim próbuje pisać własną rękę.

Może nie potrzebuję

Maszynopis obsługuje teraz --allowJsflagę i sprawi, że kolejne wnioski oparte JS w plikach .js. Można spróbować w tym pliku js w swojej kompilacji wraz z --allowJsustawieniem aby zobaczyć, czy to daje dość dobre informacje typu. Maszynopis rozpozna takie rzeczy klas ES5 stylu i komentarze JSDoc w tych plikach, ale może się potknął się, gdy biblioteka inicjalizuje się w dziwny sposób.

Zacznij korzystać z --allowJs

Jeśli --allowJsdał ci przyzwoite rezultaty i chcesz napisać lepszą definicję złożyć samemu, można połączyć --allowJsz --declarationzobaczyć „najbardziej prawdopodobne” maszynopis pod adresem rodzajów bibliotece. To daje przyzwoity punkt wyjścia, a może być tak dobry, jak plik ręcznie autorem jeśli komentarze JSDoc są dobrze napisane i kompilator mógł je znaleźć.

Pierwsze kroki z DTS-gen

Jeśli --allowJsnie działa, może chcesz używać DTS-gen ( https://github.com/Microsoft/dts-gen ), aby uzyskać punkt wyjścia. To narzędzie wykorzystuje postać wykonania przedmiotu dokładnie wyliczyć wszystkich dostępnych właściwości. Na plus to wydaje się być bardzo dokładne, ale narzędzie nie obsługuje jeszcze skrobanie komentarze JSDoc aby wypełnić dodatkowe typy. Uruchomić to tak:

npm install -g dts-gen
dts-gen -m <your-module>

Spowoduje to wygenerowanie your-module.d.tsw bieżącym folderze.

Naciśnij przycisk drzemki

Jeśli chcesz po prostu zrobić to później i iść bez typów na chwilę, w maszynopisie 2.0 można teraz napisać

declare module "foo";

który pozwoli Ci importsię "foo"moduł z rodzaju any. Jeśli globalny chcesz zająć się później, wystarczy napisać

declare const foo: any;

który daje foozmienną.

Odpowiedział 02/10/2012 o 16:11
źródło użytkownik

głosy
7

jak opisano w http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript na 00:33:52 oni zbudowali narzędzie do konwersji WebIDL i WinRT metadane do d.ts maszynopis

Odpowiedział 02/10/2012 o 19:24
źródło użytkownik

głosy
10

Jak mówi Ryan, kompilator TSC posiada przełącznik --declaration, który generuje .d.tsplik z .tspliku. Należy również pamiętać, że (zaporę bugs) maszynopis powinien być w stanie skompilować Javascript, więc można przekazać istniejący kod JavaScript, żeby kompilator TSC.

Odpowiedział 02/10/2012 o 22:02
źródło użytkownik

głosy
2

Chciałbym spojrzeć na istniejącym odwzorowaniu swoimi 3rd party bibliotek JS, które obsługują skryptów # lub SharpKit. Użytkownicy tych C #, aby js krzyż kompilatory będzie miał do czynienia z problemem teraz twarz i może opublikowali program open source do skanowania 3rd party lib i konwersji do klas szkielet C #. Jeśli tak siekać program do generowania skanera maszynopis zamiast C #.

W przypadku jego braku, tłumacząc C # publiczny interfejs dla 3rd lib do definicji maszynopis może być prostsze niż robi to samo czytając źródła JavaScript.

Moje szczególne zainteresowanie jest ExtJS RIA framework Sencha i wiem, że projekty zostały opublikowane w celu wygenerowania interpretację C # dla Script # lub SharpKit

Odpowiedział 04/10/2012 o 16:37
źródło użytkownik

głosy
13

Najlepszym sposobem radzenia sobie z tym (jeśli plik deklaracja nie jest dostępny na DefinitelyTyped ) jest napisanie deklaracji tylko za rzeczy, których używasz zamiast całej biblioteki. Zmniejsza to dużo pracować - a dodatkowo kompilator jest tam, aby pomóc przez narzekają metod brakuje.

Odpowiedział 19/10/2015 o 08:08
źródło użytkownik

głosy
25

Można użyć tsc --declaration fileName.tsjak Ryan opisuje, czy można określić declaration: truena podstawie compilerOptionsw swojej tsconfig.jsonzakładając już miał tsconfig.jsonpod swoim projektem.

Odpowiedział 03/08/2016 o 23:54
źródło użytkownik

głosy
2

Oto PowerShell, który tworzy jeden plik definicji maszynopis biblioteka, która zawiera wiele *.jsplików z nowoczesnym JavaScript.

Po pierwsze, zmienić wszystkie rozszerzenia .ts.

Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }

Po drugie, należy użyć kompilatora maszynopis do generowania plików definicji. Nie będzie pęczek błędów kompilatora, ale możemy ignorować tych.

Get-ChildItem | foreach { tsc $_.Name  }

Wreszcie, połączyć wszystkie *.d.tspliki w jednym index.d.ts, usuwając importoświadczenia i usunięcie defaultz każdego rachunku eksportu.

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 $_ }

Ten kończy się jednym, użytecznego index.d.tspliku, który zawiera wiele definicji.

Odpowiedział 19/08/2016 o 21:44
źródło użytkownik

głosy
0

Podczas tworzenia własnej biblioteki, możesz mogą tworzyć *.d.tspliki przy użyciu tscpolecenia (maszynopis Compiler) tak: (zakładając, że budujesz swoją bibliotekę w dist/libfolderze)

tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
  • -d( --declaration) Generuje *.d.tspliki
  • --declarationDir dist/lib: Katalog wyjściowy dla generowanych plików deklaracji.
  • --declarationMap: Generuje sourcemap dla każdego odpowiedniego pliku”.d.ts.
  • --emitDeclarationOnly: Emitują tylko pliki deklarację .d.ts. (Nie opracowano JS)

(patrz dokumenty dla wszystkich opcji linii poleceń kompilatora)

Albo na przykład w twojej package.json:

"scripts": {
    "build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}

a następnie uruchomić: yarn build:types(a npm run build:types)

Odpowiedział 23/09/2019 o 18:24
źródło użytkownik

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