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

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

Ответы на вопрос(7)

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

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

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

 28 янв. 2013 г., 15:38
Эй, Кэмел Кейс, я собрал блог об использовании ExtJs с машинописью:blorkfish.wordpress.com/2013/01/28/using-extjs-with-typescript
 13 дек. 2012 г., 12:31
К вашему сведению: я только что сделал свой первый файл определения машинописи для Sencha / ExtJS:github.com/andremussche/extjsTypescript/blob/master/jsondocs/…

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

как описано вhttp://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript в 00:33:52 они создали инструмент для преобразования метаданных WebIDL и WinRT в TypeScript d.ts

Как говорит Райан, компилятор tsc имеет переключатель--declaration который генерирует.d.ts файл из.ts файл. Также обратите внимание, что (исключая ошибки) предполагается, что TypeScript способен компилировать Javascript, поэтому вы можете передавать существующий код javascript в компилятор tsc.

 03 окт. 2012 г., 22:48
из того, что я могу сказать, tsc может скомпилировать любой допустимый JavaScript, но если он не является допустимым TypeScript (компиляция выдает предупреждения), то флаг --declarations не выводит файл .d.ts, поэтому, если ваша библиотека написана на TypeScript, еще нужно вручную создать файл объявлений.
 03 окт. 2012 г., 12:00
Кажется, что в настоящее время передача файлов * .js в tsc приводит к ошибке «Ошибка чтения файла» angular-resource.js »: файл не найден». Поэтому вы должны явно переименовать файлы * .js в * .ts, чтобы иметь возможность использовать tsc. Смотрите эту проблему для более подробной информации - я попытался использовать это на angularjs:typescript.codeplex.com/workitem/26

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

 08 июн. 2018 г., 13:55
Второй шаг, Get-ChildItem | foreach {tsc--declaration $ _. Name} сработало (добавлен пропущенный параметр --declaration)
Решение Вопроса

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

Maybe It Exists Already

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

Maybe You Don't Need One

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

Get Started With --allowJs

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

Get Started with 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 в текущей папке.

Hit the Snooze Button

Если вы просто хотите сделать все это позже и какое-то время обходиться без типов, в TypeScript 2.0 вы теперь можете написать

declare module "foo";

который позволит вамimport "foo" модуль с типомany, Если у вас есть глобальный, с которым вы хотите иметь дело позже, просто напишите

declare const foo: any;

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

 19 окт. 2012 г., 11:03
+1 - еще одна хорошая новость:--declarations генерирует как.js файл и.d.ts файл, что означает, что вам нужно запустить только один компилятор.
 Hotrodmonkey02 окт. 2012 г., 20:13
Ой ... это будет серьезным препятствием для входа во многих случаях. Было бы неплохо иметь инструмент, который мог бы выводить по крайней мере "лучшие догадки" основанный на выводе типа. Хотя они могут быть неоптимальными, они могут быть по крайней мере настроены с течением времени.
 20 окт. 2012 г., 03:58
Собрание высококачественных определений для популярных библиотек можно найти по адресуgithub.com/borisyankov/DefinitelyTyped
 20 окт. 2012 г., 03:59
«Лучшее предположение»; инструмент не будет лучше, чем IntelliSense, уже существующий в TypeScript. Преимущество определений типов заключается в том, что они предоставляют компилятору больше информации, чем он может «угадать».
 27 сент. 2016 г., 09:52
--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 под ваш проект.

 29 сент. 2016 г., 22:27
Это лучший ответ, если вы разрабатываете модуль Angular 2, которым вы хотели бы поделиться.
 27 сент. 2017 г., 14:44
Если я попробуюtsc --declaration test.ts Я получаю ошибкуCannot find name... для типов, для которых я пытаюсь создать файл объявления :) Итак, мне нужны типы, прежде чем я смогу их объявить?
 28 сент. 2017 г., 04:22
@Kokodoko, вы можете попробовать добавитьdeclaration: true на вашtsconfig.json файл?

Ваш ответ на вопрос