Как вы производите a.d.TS" typings " файл определения из существующей библиотеки JavaScript?
Я использую много библиотек как своих, так и сторонних. Я вижу, что каталог" typings " содержит некоторые для Jquery и WinRT... но как они создаются?
7 ответов
есть несколько вариантов, доступных для вас, в зависимости от библиотеки в вопрос, как это написано, и какой уровень точности, который вы ищете. Давайте рассмотрим варианты, примерно в порядке убывания желательности.
Может Быть, Он Уже Существует
всегда проверять DefinitelyTyped (https://github.com/DefinitelyTyped/DefinitelyTyped) первый. Это РЕПО сообщества, полное буквально тысяч .д.файлы 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
не работает, вы можете использовать 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
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.ТС
Я бы искал существующее сопоставление ваших сторонних библиотек JS, которые поддерживают Script# или SharpKit. Пользователи этих C# to .JS cross compilers столкнется с проблемой, с которой вы сейчас столкнулись, и, возможно, опубликовал программу с открытым исходным кодом для сканирования вашего 3rd party lib и преобразования в классы скелета c#. Если это так взломать программу сканера для генерации TypeScript вместо C#.
в противном случае перевод открытого интерфейса C# для вашего стороннего lib в определения TypeScript может быть проще, чем делать то же самое, читая исходный JavaScript.
мой особый интерес-рамки ExtJS RIA Sencha, и я знаю, что были опубликованы проекты для создания интерпретации C# для скрипта# или 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
файл, который включает в себя многие из определений.