Как использовать TypeScript с Egg.js

Node.js JavaScript TypeScript Egg.js

Сам Egg.js написан не на TypeScript, но предоставляетindex.d.tsфайл, поэтому мы можем легко использовать TypeScript в нашем приложении Egg.

Шаблоны с использованием TypeScript в Egg.js:egg-ts-boilerplate.

Этот шаблон показывает, как писать такие вещи, какcontroller,service, конфигурация, база данных, запланированные задачи и расширения и другие концепции приложения яйца.

Эта статья является расширенным чтением этого шаблона, в основном для объяснения некоторых основных понятий, чтобы помочь пользователям, которые не очень хорошо знакомы с TypeScript, понять.

TypeScript

Основная идея TypeScript — писать в синтаксисе TypeScript..tsфайл, который затем компилируется компилятором в.jsдокумент. Согласно синтаксису TypeScript, если вы используете класс, его нужно сначала объявить, иначе компилятор его «не знает» и не скомпилирует.

Суть использования TypeScript в вашем собственном приложении Egg заключается в том, «как заставить компилятор распознавать классы в библиотеке Egg».index.d.ts.

index.d.ts

Ключом к использованию TypeScript в Egg являетсяindex.d.tsдокумент.

index.d.tsкак в С/С++.hдокумент. Его роль можно просто понять как объявление API классов и библиотек.

Хотя Egg не написан на TypeScript, он обеспечиваетindex.d.tsфайл, поэтому, когда вы находитесь в своем приложенииimport xxx from 'egg', компилятор знает, как с этим справиться.

Первая основная проблема использования TypeScript в Egg: Egg'sindex.d.tsДокументация, авторы Egg и сообщество помогли нам (хотя и не совсем).

Второй вопрос: в нашем приложенииcontrollerа такжеserviceподождите, это от яйцаController,ServiceУнаследовано от других классов. Эти настройки находятся в Egg'sindex.d.tsнедоступен в , поэтому его нужно записать вмой собственный index.d.tsв файле.

// egg-ts-boilerplate/index.d.ts

declare module 'egg' {
  export interface Application {
    config: EggAppConfig & DefaulConfig;
    bar: string;
  }

  export interface IController {
    home: HomeController;
  }

  export interface IService {
    home: HomeService;
  }
}

Этоegg-ts-boilerplateизindex.d.ts. Теперь компилятор "знает"app.config,app.bar,controller.homeа такжеservice.home.

В общем, пойми и поймиindex.d.ts, вы можете свободно использовать TypeScript для написания приложений Egg.

Политика разрешения модуля

Знакомство со стратегией разрешения модулей TypeScript помогает при столкновении сnot found moduleУстранение неполадок при возникновении ошибок.

TypeScript поддерживает две стратегии:classа такжеnode.egg-ts-boilerplateиспользуетnodeрежим (в.tsconfig.jsonопределено в).

Его порядок разбора аналогичен Node.js. предположим в/root/src/moduleA.tsсерединаimport 'moduleB', порядок разбора такой:

  1. /root/src/node_modules/moduleB.ts
  2. /root/src/node_modules/moduleB.tsx
  3. /root/src/node_modules/moduleB.d.ts
  4. /root/src/node_modules/moduleB/package.jsonсерединаtypesАтрибуты
  5. /root/src/node_modules/moduleB/index.ts
  6. /root/src/node_modules/moduleB/index.tsx
  7. /root/src/node_modules/moduleB/index.d.ts
  8. /root/node_modules/moduleB.ts
  9. /root/node_modules/moduleB.tsx
  10. /root/node_modules/moduleB.d.ts
  11. /root/node_modules/moduleB/package.jsonсерединаtypesАтрибуты
  12. /root/node_modules/moduleB/index.ts
  13. /root/node_modules/moduleB/index.tsx
  14. /root/node_modules/moduleB.index.d.ts
  15. /node_modules/moduleB.ts
  16. /node_modules/moduleB.tsx
  17. /node_modules/moduleB.d.ts
  18. /node_modules/moduleB/package.jsonсерединаtypesАтрибуты
  19. /node_modules/moduleB/index.ts
  20. /node_modules/moduleB/index.tsx
  21. /node_modules/moduleB/index.d.ts

Основная идея состоит в том, чтобы сначала найти файл с таким же именем, а если нет, рассматривать имя модуля как папку. Выдает, если не найдены все путиnot foundошибка.

обратите внимание здесьimport 'moduleB'является неотносительным путем. Если это относительный путь, он будет разрешен в соответствии с указанным путем.

Для получения подробных инструкций вы можете прочитать документацию:Module Resolution

Расположение скомпилированных файлов

Обычно при использовании TypeScript.tsфайл в/srcпапку, а затем скомпилируйте полученный.jsфайл в/buildпапка, приложение фактически запущено/buildв папке.jsдокумент.

Egg имеет обязательные требования к структуре папок приложений, поэтому в.tsconfig.jsonВыходная папка не указана в , поэтому скомпилированный.jsфайл будет и.tsФайлы находятся в одном каталоге.

Если вы используете VSCode, он не отображается в проводнике после компиляции..jsфайл (видимый в Finder). Потому что/.vscode/setting.jsonустановить в.jsФайл не виден (и также невидимnode_module/Ждать). Если вы используете другие редакторы, вы можете сделать соответствующие настройки.