tsc --out --declaration не включает настраиваемые интерфейсы

Настройка
Допустим, у нас есть два файла: A.ts и B.d.ts. Теперь внутри A у нас есть:

class A implements B{...}

Теперь предположим, что я хочу объединить все мои файлы машинописных текстов в один файл определения. Единственный способ, которым я знаю, как это сделать, - это создать файл .js, а затем также результирующий файл .d.ts.

Поэтому мы делаем:

tsc --out foo.js --declaration B.d.ts A.ts

Получаем foo.js и foo.d.ts.

Теперь единственная проблема заключается в том, что foo.d.ts содержит определение только для A.ts, а не для B.d.ts. Итак, чтобы наш сгенерированный foo.d.ts действительно работал и не выдавал ошибок, нам нужно добавить ручную ссылку на B.d.ts ИЛИ нам нужно скопировать и вставить все содержимое B.d.ts в foo.d.ts.

Оба решения довольно уродливые. Итак, есть ли способ создать единый файл объявления через компилятор машинописного текста, который также будет включать пользовательские интерфейсы? Я, должно быть, что-то упускаю ...


person N. Taylor Mullen    schedule 22.05.2013    source источник


Ответы (2)


Такое поведение задумано специально, чтобы упростить написание расширений библиотеки и управление зависимостями. Например, если вы пишете плагин jQuery, вам нужно, чтобы ваш .d.ts файл содержал все ваши определения, но не определения jQuery. По этой причине компилятор не будет добавлять ничего из "внешних" .d.ts файлов в объединенный .d.ts файл, который вы создаете.

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

Если вы хотите, чтобы код был включен в ваш единственный скомпилированный .d.ts файл, он должен происходить из файла .ts без префикса d. Это означает добавление ключевого слова declare к модулям / классам внутри файла, но на самом деле это может стать требованием в версии 0.9 в любом случае даже для файлов .d.ts, так что это не так много накладных расходов.

По сути, вы можете думать о расширениях файлов следующим образом:

  • .ts файлы являются внутренними по отношению к программе
  • .d.ts файлы являются внешними зависимостями
person Fenton    schedule 22.05.2013

Используйте B.ts вместо B.d.ts

Вы можете увидеть образец здесь: https://github.com/basarat/ts-test/tree/master/tests/compileToSingle

Мой out.d.ts https://github.com/basarat/ts-test/blob/master/tests/compileToSingle/out.d.ts содержит интерфейс из dec .ts: https://github.com/basarat/ts-test/blob/master/tests/compileToSingle/dec.ts

Мой out.d.ts не содержал интерфейса: https://github.com/basarat/ts-test/blob/34eeb54618e57765ea0e2f9ce0c48ebd7f46942a/tests/compileToSingle/out.d.ts Если бы у меня был dec. d.ts: https://github.com/basarat/ts-test/blob/34eeb54618e57765ea0e2f9ce0c48ebd7f46942a/tests/compileToSingle/dec.d.ts

Вы можете использовать ключевое слово declare для своих классов / переменных и т. Д. В .ts. Не используйте объявление для интерфейсов, так как это нарушает TS> 0.9.

person basarat    schedule 22.05.2013