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