Я использую много библиотек, как своих, так и сторонних. Я вижу, что каталог "typings" содержит некоторые для Jquery и WinRT ... но как они создаются?
Я использую много библиотек, как своих, так и сторонних. Я вижу, что каталог "typings" содержит некоторые для Jquery и WinRT ... но как они создаются?
Ответы:
В зависимости от библиотеки, от того, как она написана и какой уровень точности вы ищете, вам доступно несколько вариантов. Давайте рассмотрим варианты в порядке убывания желательности.
Всегда сначала проверяйте DefinitiveTyped ( https://github.com/DefiniteTyped/DefiniteTyped ). Это репозиторий сообщества, полный буквально тысяч файлов .d.ts, и вполне вероятно, что то, что вы используете, уже есть. Вам также следует проверить TypeSearch ( https://microsoft.github.io/TypeSearch/ ), который является поисковым механизмом для опубликованных NPM файлов .d.ts; это будет иметь немного больше определений, чем DefinitiveTyped. Несколько модулей также поставляют свои собственные определения как часть своего дистрибутива NPM, поэтому также посмотрите, так ли это, прежде чем пытаться написать свои собственные.
TypeScript теперь поддерживает --allowJs
флаг и сделает больше выводов на основе JS в файлах .js. Вы можете попробовать включить файл .js в компиляцию вместе с --allowJs
настройкой, чтобы проверить, дает ли это достаточно хорошую информацию о типе. TypeScript распознает такие вещи, как классы в стиле ES5 и комментарии JSDoc в этих файлах, но может сработать, если библиотека странным образом инициализирует себя.
--allowJs
Если --allowJs
вам дали неплохие результаты , и вы хотите , чтобы написать лучший файл определения себя, вы можете комбинировать --allowJs
с , --declaration
чтобы увидеть «лучшее предположение» Машинописи по адресу типов библиотеки. Это даст вам достойную отправную точку и может быть таким же хорошим, как и файл, созданный вручную, если комментарии JSDoc хорошо написаны и компилятор смог их найти.
Если --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
переменную.
--declarations
генерирует как .js
файл, так и .d.ts
файл, что означает, что вам нужно всего лишь запустить одну компиляцию.
--allowJs
с --declaration
параметрами не могут быть объединены (проверено в TypeScript 1.8 и 2.0). Если я попытаюсь, я получу:error TS5053: Option 'allowJs' cannot be specified with option 'declaration'
Вы можете использовать tsc --declaration fileName.ts
как Райан описывает, или вы можете указать declaration: true
при compilerOptions
в вашем tsconfig.json
предположении , что вы уже имели tsconfig.json
под свой проект.
tsc --declaration test.ts
получить ошибку Cannot find name...
для типов, для которых я пытаюсь создать файл объявления :) Итак, мне нужны типы, прежде чем я смогу их объявить?
declaration: true
в свой tsconfig.json
файл?
Лучший способ справиться с этим (если файл объявлений недоступен для DefinitiveTyped ) - это писать объявления только для тех вещей, которые вы используете, а не для всей библиотеки. Это значительно сокращает работу - и, кроме того, компилятор может помочь, жалуясь на отсутствующие методы.
Как говорит Райан, компилятор tsc имеет переключатель, --declaration
который генерирует .d.ts
файл из .ts
файла. Также обратите внимание, что (исключая ошибки) предполагается, что 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
Вот некоторый 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
файлом, который включает в себя множество определений.
Я бы искал существующее отображение ваших сторонних JS-библиотек, которые поддерживают Script # или SharpKit. Пользователи этих кросс-компиляторов C # to .js столкнутся с проблемой, с которой вы сейчас столкнулись, и, возможно, опубликовали программу с открытым исходным кодом для сканирования вашей сторонней библиотеки lib и преобразования в скелетные классы C #. Если это так, взломайте программу сканера, чтобы сгенерировать TypeScript вместо C #.
В противном случае преобразование общедоступного интерфейса C # для вашей сторонней библиотеки в определения TypeScript может быть проще, чем делать то же самое, читая исходный JavaScript.
Меня особенно интересует среда ExtJS RIA от Sencha, и я знаю, что были опубликованы проекты по созданию интерпретации C # для Script # или SharpKit
При создании вашей собственной библиотеки вы можете создавать *.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
файлы и использовать интерфейсы. У вас есть примеры?
*.d.ts
файлы и поместит их в dist/lib
папку. Вам нужен tsconfig.json
файл в корне вашего проекта, но он должен быть там, чтобы проект работал в любом случае.