Korzystam z wielu bibliotek, zarówno własnych, jak i zewnętrznych. Widzę, że katalog „typings” zawiera trochę Jquery i WinRT ... ale jak są tworzone?
Korzystam z wielu bibliotek, zarówno własnych, jak i zewnętrznych. Widzę, że katalog „typings” zawiera trochę Jquery i WinRT ... ale jak są tworzone?
Odpowiedzi:
Dostępnych jest kilka opcji, w zależności od biblioteki, o której mowa, w jaki sposób jest napisana i jakiego poziomu dokładności szukasz. Przyjrzyjmy się opcjom w przybliżeniu malejącym porządku pożądania.
Zawsze najpierw sprawdź ZdecydowanieTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ). Jest to repozytorium społeczności pełne dosłownie tysięcy plików .d.ts i jest bardzo prawdopodobne, że używasz już tego. Powinieneś także sprawdzić TypeSearch ( https://microsoft.github.io/TypeSearch/ ), która jest wyszukiwarką plików .d.ts opublikowanych przez NPM; to będzie miało nieco więcej definicji niż DefinentlyTyped. Kilka modułów dostarcza również własne definicje w ramach dystrybucji NPM, więc sprawdź, czy tak jest przed próbą napisania własnych.
TypeScript obsługuje teraz --allowJs
flagę i uczyni więcej wniosków opartych na JS w plikach .js. Możesz spróbować dołączyć plik .js do kompilacji wraz z --allowJs
ustawieniem, aby sprawdzić, czy daje to wystarczająco dobre informacje o typie. TypeScript rozpozna w tych plikach klasy typu ES5 i komentarze JSDoc, ale może się potknąć, jeśli biblioteka zainicjuje się w dziwny sposób.
--allowJs
Jeśli --allowJs
dałeś przyzwoite wyniki i chcesz sam napisać plik lepszej definicji, możesz połączyć go --allowJs
z, --declaration
aby zobaczyć „najlepsze odgadnięcie” TypeScript na temat typów bibliotek. To da ci dobry punkt wyjścia i może być tak dobry, jak ręcznie napisany plik, jeśli komentarze JSDoc są dobrze napisane, a kompilator był w stanie je znaleźć.
Jeśli --allowJs
nie zadziałało, możesz użyć dts-gen ( https://github.com/Microsoft/dts-gen ), aby uzyskać punkt początkowy. To narzędzie używa kształtu środowiska wykonawczego obiektu do dokładnego wyliczenia wszystkich dostępnych właściwości. Na plus jest to zwykle bardzo dokładne, ale narzędzie nie obsługuje jeszcze skrobania komentarzy JSDoc w celu wypełnienia dodatkowych typów. Uruchamiasz to tak:
npm install -g dts-gen
dts-gen -m <your-module>
To wygeneruje your-module.d.ts
w bieżącym folderze.
Jeśli chcesz zrobić to wszystko później i przez jakiś czas nie używać typów, w TypeScript 2.0 możesz teraz pisać
declare module "foo";
co pozwoli ci import
na "foo"
moduł z typem any
. Jeśli masz globalny dokument, z którym chcesz poradzić sobie później, po prostu napisz
declare const foo: any;
co da ci foo
zmienną.
--declarations
generuje zarówno .js
plik, jak i .d.ts
plik, co oznacza, że wystarczy uruchomić tylko jedną kompilację.
--allowJs
z --declaration
opcjami nie można łączyć (testowane w TypeScript 1.8 i 2.0). Jeśli spróbuję, otrzymam:error TS5053: Option 'allowJs' cannot be specified with option 'declaration'
Można użyć tsc --declaration fileName.ts
jak Ryan opisuje, czy można określić declaration: true
na podstawie compilerOptions
w swojej tsconfig.json
zakładając już miał tsconfig.json
pod swoim projektem.
tsc --declaration test.ts
się błąd Cannot find name...
dla typów, dla których próbuję utworzyć plik deklaracji :) Więc potrzebuję typów, zanim będę mógł je zadeklarować?
declaration: true
do swojego tsconfig.json
pliku?
Najlepszym sposobem na poradzenie sobie z tym (jeśli plik deklaracji nie jest dostępny w ZdecydowanieTyped ) jest pisanie deklaracji tylko dla rzeczy, których używasz, a nie dla całej biblioteki. To znacznie zmniejsza nakład pracy - a dodatkowo kompilator jest w stanie pomóc, narzekając na brakujące metody.
Jak mówi Ryan, kompilator tsc ma przełącznik, --declaration
który generuje .d.ts
plik z .ts
pliku. Zauważ też, że (z wyjątkiem błędów) TypeScript powinien być w stanie kompilować Javascript, więc możesz przekazać istniejący kod javascript do kompilatora tsc.
jak opisano w http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript o 00:33:52 stworzyli narzędzie do konwersji metadanych WebIDL i WinRT na TypeScript d.ts
Oto niektóre PowerShell, który tworzy pojedynczy plik definicji TypeScript, bibliotekę zawierającą wiele *.js
plików z nowoczesnym JavaScript.
Najpierw zmień wszystkie rozszerzenia na .ts
.
Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }
Po drugie, użyj kompilatora TypeScript do wygenerowania plików definicji. Będzie wiele błędów kompilatora, ale możemy je zignorować.
Get-ChildItem | foreach { tsc $_.Name }
Na koniec połącz wszystkie *.d.ts
pliki w jeden index.d.ts
, usuwając import
instrukcje i usuwając je default
z każdej instrukcji 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 $_ }
Kończy się to jednym użytecznym index.d.ts
plikiem, który zawiera wiele definicji.
Tworząc własną bibliotekę, możesz tworzyć *.d.ts
pliki za pomocą tsc
komendy (TypeScript Compiler) w następujący sposób: (zakładając, że budujesz bibliotekę do dist/lib
folderu)
tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
-d
( --declaration
): generuje *.d.ts
pliki--declarationDir dist/lib
: Katalog wyjściowy dla wygenerowanych plików deklaracji.--declarationMap
: Generuje sourcemap dla każdego odpowiedniego pliku „.d.ts”.--emitDeclarationOnly
: Emituj tylko pliki deklaracji „.d.ts”. (brak skompilowanego JS)(zobacz dokumentację wszystkich opcji kompilatora wiersza poleceń)
Lub na przykład w package.json
:
"scripts": {
"build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}
a następnie uruchom: yarn build:types
(lub npm run build:types
)
d.ts
pliki i móc korzystać z interfejsów. Czy masz jakieś przykłady?
*.d.ts
pliki i umieści je w dist/lib
folderze. Potrzebny jest tsconfig.json
plik w katalogu głównym projektu, ale i tak powinien on istnieć, aby projekt mógł działać.
Poszukałbym istniejącego mapowania bibliotek JS innych firm, które obsługują Script # lub SharpKit. Użytkownicy tych kompilatorów krzyżowych C # do .js napotkają problem, z którym się teraz borykają, i mogą opublikować program open source do skanowania bibliotek innych firm i konwersji do szkieletowych klas C #. Jeśli tak, zhakuj program skanujący, aby wygenerować TypeScript zamiast C #.
W przeciwnym razie tłumaczenie publicznego interfejsu C # dla biblioteki innych firm na definicje TypeScript może być prostsze niż robienie tego samego przez odczytanie źródłowego JavaScript.
Moim szczególnym zainteresowaniem jest framework ExtJS RIA firmy Sencha i wiem, że opublikowano projekty generujące interpretację C # dla Script # lub SharpKit