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?
Jak można produkować .d.ts „typowania” plik definicja z istniejącej biblioteki JavaScript?
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ą.
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.
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.
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.
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
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.
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
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)













