Как вы создаете файл определения.d. ts "typings" из существующей библиотеки JavaScript?
Я использую много библиотек как свои собственные, так и сторонние. Я вижу, что каталог "typings" содержит некоторые для Jquery и WinRT... но как они создаются?
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";, что позволит
importthe"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файл, который включает в себя многие из определений.