Я хочу поделиться с вами некоторыми потенциально полезными лайфхаками и решениями, которые я курировал на пути миграции наших сервисов Javascript на Typescript.
Смешанные файлы .js и .ts
После того, как вы, вероятно, добавили tsconfig.json
в корень вашего проекта, ваш проект начнется со смешанных файлов .ts и .js, поэтому поддержка этой комбинации гарантирует, что вы добавили эти поля:
"allowJs": true, "esModuleInterop": true
Поддержка глобальных переменных
В вашей кодовой базе javascript нередко можно обнаружить использование переменных, которые никогда не были определены в файле, и, скорее всего, вы получите TSERROR, если эта переменная не определена. Таким образом, чтобы сообщить транспилятору машинописного текста, что эти переменные существуют и он должен нам «доверять», мы можем добавить файл где-нибудь в наши исходные файлы, например, с именем example globals.d.ts
, содержащий:
export declare global { var logger: any; var models: any } export declare namespace NodeJS { interface Global { logger: any; models: any } }
Импорт файла .js из файла .ts
При попытке импортировать файл Javascript, скажем, example.js,
из файла Typescript, не тривиально, что эта комбинация будет работать из коробки.
Один из вариантов сделать это — использовать обычный импорт старых узлов: const example = require('./example')
И это сработает!
Но допустим, мы хотим, чтобы наш код был чистым и соответствовал стандартам Typescript, и использовал стиль экспорта/импорта, например:import example from “example”
К сожалению, это неожиданно не сработало, вы верите?< br /> Что происходит, и я избавлю вас от надоедливых исследований, так это то, что этот код транспилируется в это:const example = require('example').default
и, поскольку example.js
написан на чистом Javascript, он был транспилирован, и поэтому нет{default: MODULE}
оболочка создается в выходном файле example.js
.
Что мы можем сделать, чтобы решить эту проблему?import * as Example from “example”;
Этот синтаксис обходит ожидаемый require('example').default
и просто заключает все, что экспортирует модуль, в объект Example
.
ts-узел
Пока вы пишете машинописный код узла, вы можете запустить свой проект непосредственно в машинописном тексте, а не запускать tsc
, а затем запускать полученный файл .js
.ts-node
делает именно это! вы можете сказать свое слово, index.ts
, непосредственно с помощью ts-node index.ts
. Вы также можете просто запустить команду ts-node и использовать ее Typescript REPL, что очень полезно для тестирования.
Одно небольшое предостережение: если вы хотите, чтобы ts-node использовал ближайший tsconfig.json
, что очень важно, поскольку некоторая конфигурация подходит идеально подходит для вашего проекта, но конфигурация ts-node по умолчанию может вызвать некоторые ошибки, которые могут вас запутать. Поэтому убедитесь, что вы добавили это в свой файл tsconfig.json
:
"ts-node": { "files": true }