Як ви створюєте файл визначення .d.ts "типізація" з існуючої бібліотеки JavaScript?


193

Я використовую багато бібліотек як власної, так і третьої сторони. Я бачу, що каталог "типізації" містить деякі для Jquery та WinRT ... але як вони створені?

Відповіді:


232

Залежно від бібліотеки, як вона написана та якого рівня точності ви шукаєте, є кілька варіантів. Розглянемо варіанти, приблизно в порядку зменшення бажаності.

Можливо, воно вже існує

Завжди переконайтеся, що визначено точно ( 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 добре написані і компілятор зміг їх знайти.

Початок роботи з dts-gen

Якщо --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змінну.


25
Так, це стане суттєвою перешкодою для вступу у багатьох випадках. Було б непогано мати інструмент, який може вивести принаймні "найкращі здогадки" на основі виводу типу. Хоча це може бути не оптимальним, їх можна принаймні налаштувати з часом.
Hotrodmonkey

7
+1 - Наступні хороші новини: --declarationsгенерується і .jsфайл, і .d.tsфайл, а значить, потрібно запустити лише один компілятор.
Фентон

67
Колекцію високоякісних визначень для популярних бібліотек можна знайти на сайті github.com/borisyankov/DefinrelyTyped
Борис Янков

10
Інструмент "найкраща здогадка" не буде кращим, ніж IntelliSense, який вже існує в TypeScript. Перевага визначення типів полягає в наданні компілятора більше інформації, ніж він може «здогадуватися».
Борис Янков

12
--allowJsз --declarationпараметрами не можна поєднувати (тестується в TypeScript 1.8 та 2.0). Якщо я спробую, отримаю:error TS5053: Option 'allowJs' cannot be specified with option 'declaration'
Олексій

53

Ви можете використовувати tsc --declaration fileName.tsяк Райан описує, або ви можете вказати declaration: trueпри compilerOptionsв вашому tsconfig.jsonприпущенні , що ви вже мали tsconfig.jsonпід свій проект.


4
Це найкраща відповідь, якщо ви розробляєте модулі Angular 2, якими ви хочете поділитися.
Дарсі

Якщо я спробую, tsc --declaration test.tsя отримаю помилку Cannot find name...для типів, для яких я намагаюся створити файл декларації :) Отже, мені потрібні типи, перш ніж я можу їх оголосити?
Кокодоко

2
@Kokodoko, чи можете ви спробувати додати declaration: trueдо свого tsconfig.jsonфайлу?
JayKan

Дякую, я просто хотів генерувати * .d.ts з * .ts.
vintproykt

16

Найкращий спосіб впоратися з цим (якщо файл декларації недоступний на DefinitelyTyped ) - писати декларації лише для речей, які ви використовуєте, а не всієї бібліотеки. Це значно скорочує роботу - і крім того, компілятор є для того, щоб допомогти, скаржившись на відсутні методи.


15

Як каже Райан, компілятор tsc має комутатор, --declarationякий генерує .d.tsфайл з .tsфайлу. Також зауважте, що (помилки заборони) TypeScript повинен мати можливість компілювати Javascript, тому ви можете передавати існуючий код javascript компілятору tsc.


1
здається, що зараз передача файлів * .js в tsc створює помилку "Помилка читання файлу" angular-resource.js ": Файл не знайдено". Тому вам доведеться явно перейменувати * .js файли в * .ts, щоб мати можливість використовувати tsc. Дивіться це питання для більш докладної інформації - я спробував використовувати це на angularjs: typescript.codeplex.com/workitem/26
Джеймс Страчан

3
з того, що я можу сказати, tsc може зібрати будь-який дійсний JavaScript, але якщо він недійсний TypeScript (компіляція дає попередження), прапор --declarations не виводить файл .d.ts, тому, якщо ваша бібліотека не написана в TypeScript ви ще потрібно вручну створити файл декларацій.
agradl


3

Ось декілька 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файлом, який включає багато визначень.


2
Другий крок, Get-ChildItem | foreach {tsc - декларація $ _. Ім'я} працювало (додано відсутнє - параметр декларування)
Guru_07

2

Я б шукав наявне відображення ваших сторонніх бібліотек JS, які підтримують Script # або SharpKit. Користувачі цих перехресних компіляторів C # to .js зіткнуться з проблемою, з якою ви стикаєтесь, і, можливо, опублікували програму з відкритим кодом для сканування вашої сторонніх конверторів та перетворення в скелетні C # класи. Якщо так, зламайте програму сканера для створення TypeScript замість C #.

Якщо цього не зробити, переклад загальнодоступного інтерфейсу C # для вашої сторони lib у визначення TypeScript може бути простішим, ніж це зробити, прочитавши вихідний JavaScript.

Моя особлива зацікавленість - це рамка RIA для ExtJS Sencha, і я знаю, що були опубліковані проекти для створення інтерпретації C # для сценарію # або SharpKit


FYI: Я щойно створив свій перший файл визначення машинопису для Sencha / ExtJS: github.com/andremussche/extjsTypescript/blob/master/jsondocs/…
André

Ей, Кейл Кейс, я склав блог про використання ExtJs з шрифтом
blorkfish

2

Створюючи власну бібліотеку, ви можете створювати *.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файли та вміти використовувати інтерфейси. Чи є у вас приклади?
Даносаур

Сценарій npm, наведений вище, створить *.d.tsфайли та помістить їх у dist/libпапку. Вам потрібен tsconfig.jsonфайл у корені вашого проекту, але він має бути там, щоб проект все одно працював.
magikMaker

Я не можу їх використати, одного разу піддаючись. У мене є наступний пост stackoverflow.com/questions/59742688, якщо ви можете змусити його працювати?
Даносаур
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.