Я використовую багато бібліотек як власної, так і третьої сторони. Я бачу, що каталог "типізації" містить деякі для Jquery та WinRT ... але як вони створені?
Я використовую багато бібліотек як власної, так і третьої сторони. Я бачу, що каталог "типізації" містить деякі для Jquery та WinRT ... але як вони створені?
Відповіді:
Залежно від бібліотеки, як вона написана та якого рівня точності ви шукаєте, є кілька варіантів. Розглянемо варіанти, приблизно в порядку зменшення бажаності.
Завжди переконайтеся, що визначено точно ( https://github.com/DefinrelyTyped/DefinrelyTyped ) спочатку. Це репортаж спільноти, який переповнюється буквально тисячами файлів .d.ts, і, швидше за все, те, що ви використовуєте, вже є. Ви також повинні перевірити TypeSearch ( https://microsoft.github.io/TypeSearch/ ), який є пошуковою системою для опублікованих NPM файлів .d.ts; це матиме дещо більше визначень, ніж ОпределеноТип. Кілька модулів також доставляють свої власні визначення як частину їх розповсюдження NPM, тому також перевірте, чи це так, перш ніж спробувати написати своє.
Тепер TypeScript підтримує --allowJs
прапор і зробить більше висновків на основі JS у файлах .js. Ви можете спробувати включити .js файл у свою компіляцію разом із --allowJs
налаштуваннями, щоб побачити, чи дає це достатньо хороша інформація про тип. TypeScript розпізнає такі елементи, як класи у стилі ES5 та коментарі JSDoc, у цих файлах, але може спрацювати, якщо бібліотека ініціалізує себе дивним чином.
--allowJs
Якщо --allowJs
вам дали непогані результати , і ви хочете , щоб написати кращий файл визначення себе, ви можете комбінувати --allowJs
з , --declaration
щоб побачити «краще припущення» машинопису за адресою типів бібліотеки. Це дасть вам гідну вихідну точку, і може бути настільки ж добре, як і авторський файл, якщо коментарі JSDoc добре написані і компілятор зміг їх знайти.
Якщо --allowJs
це не спрацювало, ви можете скористатися dts-gen ( https://github.com/Microsoft/dts-gen ), щоб отримати вихідну точку. Цей інструмент використовує форму об’єкта для виконання, щоб точно перерахувати всі доступні властивості. З позитивного боку це, як правило, дуже точне, але інструмент ще не підтримує скребки коментарів JSDoc для заповнення додаткових типів. Ви запускаєте це так:
npm install -g dts-gen
dts-gen -m <your-module>
Це створить your-module.d.ts
у поточній папці.
Якщо ви просто хочете це зробити все пізніше і ненадовго залишитесь без типів, у TypeScript 2.0 тепер ви можете писати
declare module "foo";
який дозволить вам import
в "foo"
модуль з типом any
. Якщо у вас є глобальний, з яким ви хочете мати справу згодом, просто напишіть
declare const foo: any;
що дасть вам foo
змінну.
--declarations
генерується і .js
файл, і .d.ts
файл, а значить, потрібно запустити лише один компілятор.
--allowJs
з --declaration
параметрами не можна поєднувати (тестується в TypeScript 1.8 та 2.0). Якщо я спробую, отримаю:error TS5053: Option 'allowJs' cannot be specified with option 'declaration'
Ви можете використовувати tsc --declaration fileName.ts
як Райан описує, або ви можете вказати declaration: true
при compilerOptions
в вашому tsconfig.json
припущенні , що ви вже мали tsconfig.json
під свій проект.
tsc --declaration test.ts
я отримаю помилку Cannot find name...
для типів, для яких я намагаюся створити файл декларації :) Отже, мені потрібні типи, перш ніж я можу їх оголосити?
declaration: true
до свого tsconfig.json
файлу?
Найкращий спосіб впоратися з цим (якщо файл декларації недоступний на DefinitelyTyped ) - писати декларації лише для речей, які ви використовуєте, а не всієї бібліотеки. Це значно скорочує роботу - і крім того, компілятор є для того, щоб допомогти, скаржившись на відсутні методи.
Як каже Райан, компілятор tsc має комутатор, --declaration
який генерує .d.ts
файл з .ts
файлу. Також зауважте, що (помилки заборони) TypeScript повинен мати можливість компілювати Javascript, тому ви можете передавати існуючий код javascript компілятору tsc.
як описано в http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript о 00:33:52 вони створили інструмент для перетворення метаданих WebIDL та WinRT в TypeScript d.ts
Ось декілька PowerShell, який створює єдиний файл визначення TypeScript, бібліотеку, яка включає кілька *.js
файлів із сучасним JavaScript.
Спочатку змініть усі розширення на .ts
.
Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }
По-друге, використовуйте компілятор TypeScript для створення файлів визначення. Буде купа помилок компілятора, але ми можемо їх ігнорувати.
Get-ChildItem | foreach { tsc $_.Name }
Нарешті, об’єднайте всі *.d.ts
файли в одне index.d.ts
, видаляючи import
оператори та видаляючи default
з кожного експорту заявку.
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 $_ }
Це закінчується одним, корисним index.d.ts
файлом, який включає багато визначень.
Я б шукав наявне відображення ваших сторонніх бібліотек JS, які підтримують Script # або SharpKit. Користувачі цих перехресних компіляторів C # to .js зіткнуться з проблемою, з якою ви стикаєтесь, і, можливо, опублікували програму з відкритим кодом для сканування вашої сторонніх конверторів та перетворення в скелетні C # класи. Якщо так, зламайте програму сканера для створення TypeScript замість C #.
Якщо цього не зробити, переклад загальнодоступного інтерфейсу C # для вашої сторони lib у визначення TypeScript може бути простішим, ніж це зробити, прочитавши вихідний JavaScript.
Моя особлива зацікавленість - це рамка RIA для ExtJS Sencha, і я знаю, що були опубліковані проекти для створення інтерпретації C # для сценарію # або SharpKit
Створюючи власну бібліотеку, ви можете створювати *.d.ts
файли, використовуючи команду tsc
(TypeScript Compiler) так: (якщо ви будуєте свою бібліотеку в dist/lib
папку)
tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
-d
( --declaration
): створює *.d.ts
файли--declarationDir dist/lib
: Вивідний каталог для згенерованих файлів декларації.--declarationMap
: Створює вихідну карту для кожного відповідного файлу '.d.ts'.--emitDeclarationOnly
: Випускають лише файли декларації '.d.ts'. (немає компільованого JS)(див. документи для всіх параметрів компілятора командного рядка)
Або, наприклад, у вашому package.json
:
"scripts": {
"build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}
а потім запустіть: yarn build:types
(або npm run build:types
)
d.ts
файли та вміти використовувати інтерфейси. Чи є у вас приклади?
*.d.ts
файли та помістить їх у dist/lib
папку. Вам потрібен tsconfig.json
файл у корені вашого проекту, але він має бути там, щоб проект все одно працював.