Как вы создаете файл определения.d. ts "typings" из существующей библиотеки JavaScript?


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

7 141

7 ответов:

есть несколько вариантов, доступных для вас, в зависимости от библиотеки в вопрос, как это написано, и какой уровень точности, который вы ищете. Давайте рассмотрим варианты, примерно в порядке убывания желательности.

Может Быть, Он Уже Существует

всегда проверяйте DefinitelyTyped (https://github.com/DefinitelyTyped/DefinitelyTyped) Во-первых. Это сообщество РЕПО, полное буквально тысяч .D. TS файлы и это очень вероятно вещь вы используете уже там. Вы также должны проверить TypeSearch (https://microsoft.github.io/TypeSearch/), который является поисковой системой для npm-published .D. TS файлы; это будет иметь немного больше определений, чем DefinitelyTyped. Несколько модулей также отправляют свои собственные определения в рамках своего распространения NPM, поэтому также посмотрите, так ли это, прежде чем пытаться написать свой собственный.

может быть, вам это не нужно

TypeScript теперь поддерживает --allowJs флаг и сделает больше выводов на основе JS .JS файлы. Вы можете попробовать в том числе .js-файл в вашей компиляции вместе с --allowJs настройки, чтобы увидеть, если это дает вам достаточно информации о типе. TypeScript распознает такие вещи, как классы ES5-style и комментарии JSDoc в этих файлах, но может быть отключен, если библиотека инициализируется странным образом.

Начнем С --allowJs

если --allowJs дал вам достойные результаты, и вы хотите написать лучше определение файла самостоятельно, вы можете комбинировать --allowJs С --declaration чтобы увидеть "лучшее предположение" TypeScript о типах библиотеки. Это даст вам достойную отправную точку и может быть так же хорошо, как файл с ручным созданием, если комментарии JSDoc хорошо написаны, и компилятор смог их найти.

начните с dts-gen

если --allowJs не работает, вы, возможно, захотите использовать ДТС-го поколения (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 the "foo" модуль типа any. Если у вас есть глобальный вы хотите иметь дело с позже, просто напишите

declare const foo: any;

который даст вам foo переменной.

можно использовать tsc --declaration fileName.ts как Райан описывает, или вы можете указать declaration: true под compilerOptionsв своем tsconfig.json предполагая, что вы уже tsconfig.json под ваш проект.

лучший способ справиться с этим (если файл декларации не доступен на DefinitelyTyped) - это писать объявления только для вещей, которые вы используете, а не для всей библиотеки. Это значительно сокращает работу-и, кроме того, компилятор должен помочь, жалуясь на отсутствующие методы.

как говорит Райан, компилятор tsc имеет переключатель --declaration который генерирует С . Также обратите внимание, что (за исключением ошибок) 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

Я бы искал существующее сопоставление ваших сторонних JS-библиотек, которые поддерживают Script# или SharpKit. Пользователи этих C# для .JS cross compilers столкнутся с проблемой, с которой вы сейчас сталкиваетесь, и, возможно, опубликовали программу с открытым исходным кодом для сканирования вашей сторонней lib и преобразования в классы skeleton C#. Если это так взломать программу сканера для создания машинописного текста вместо C#.

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

мой особый интерес-это структура ExtJS RIA от Sencha, и я знаю, что были опубликованы проекты для создания интерпретации C# для Script# или SharpKit

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