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

голоса
127

Я использую много библиотек как моя собственная и третья стороны. Я вижу каталог «типизации» содержит некоторые для Jquery и WinRT ... но как они созданы?

Задан 02/10/2012 в 10:29
источник пользователем
На других языках...                            


8 ответов

голоса
168

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

Может быть, он уже существует

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

Может быть, Вам не нужен

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

Начни --allowJs

Если --allowJsвам дали неплохие результаты , и вы хотите , чтобы написать лучшее определение файл самостоятельно, вы можете комбинировать --allowJsс , --declarationчтобы увидеть «лучшее предположение» Машинописи по адресу типов библиотеки. Это даст вам достойную отправную точку, и может быть столь же хорошо , как вручную автором файла , если комментарии JSDoc хорошо написаны , и компилятор смог найти их.

Начало работы с DTS-ген

Если --allowJsне работает, вы можете использовать DTS-ген ( https://github.com/Microsoft/dts-gen ) , чтобы получить отправную точку. Этот инструмент использует форму выполнения объекта точно перечислить все доступные свойства. С положительной стороны это имеет тенденцию быть очень точными, но инструмент не поддерживает выскабливание комментариев JSDoc для заполнения дополнительных типов. Вы запускаете это примерно так:

npm install -g dts-gen
dts-gen -m <your-module>

Это создаст your-module.d.tsв текущей папке.

Нажмите кнопку Snooze

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

declare module "foo";

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

declare const foo: any;

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

Ответил 02/10/2012 в 18:11
источник пользователем

голоса
25

Вы можете использовать tsc --declaration fileName.tsкак Райан описывает, или вы можете указать declaration: trueпри compilerOptionsв вашем tsconfig.jsonпредположении , что вы уже имели tsconfig.jsonпод свой проект.

Ответил 04/08/2016 в 00:54
источник пользователем

голоса
13

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

Ответил 19/10/2015 в 09:08
источник пользователем

голоса
10

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

Ответил 03/10/2012 в 00:02
источник пользователем

голоса
7

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

Ответил 02/10/2012 в 21:24
источник пользователем

голоса
2

Вот некоторые PowerShell , который создает один файл определения машинописи библиотеки , которая включает в себя несколько *.jsфайлов с современным JavaScript.

Во- первых, изменить все эти расширения .ts.

Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }

Во-вторых, использовать машинопись компилятор для генерации файлов определений. Там будет куча ошибок компилятора, но мы можем игнорировать их.

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

Ответил 19/08/2016 в 22:44
источник пользователем

голоса
2

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

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

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

Ответил 04/10/2012 в 18:37
источник пользователем

голоса
0

При создании собственной библиотеки, вы можете можете создать *.d.tsфайлы с помощью tscкоманды (машинопись Compiler) следующим образом: (предполагается , что вы создаете свою библиотеку в dist/libпапку)

tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
  • -d( --declaration): Генерирует *.d.tsфайлы
  • --declarationDir dist/lib: Выходной каталог для создаваемых файлов декларации.
  • --declarationMap: Формирует sourcemap для каждого соответствующего файла».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)

Ответил 23/09/2019 в 19:24
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more