Где я должен поместить файл index.d.ts?

Я пишу сервис nodeJS, который использует несколько модулей npm без @types.

Сообщение об ошибке tsc говорит мне, что мне нужно добавить файл index.d.ts, но не указывает, куда его поместить. Мой файл helper.spec.ts, который также импортирует те же модули, также не может обнаружить index.d.ts при запуске с jest

Я поместил файл в свой корень вместе с tsconfig.json, но он его не обнаружил. Мои файлы и структура выглядят так:

Структура папок

node_modules
build
    app.js
    helper.js
    another.js
spec
    - helper.spec.ts
    - another.spec.ts
src
    - app.ts
    - helper.ts
    - another.ts
tsconfig.json
index.d.ts
jest.config.json
package.json
package-lock.json

tsconfig.json

{
  "compilerOptions": {
    "target": "es6",                          /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
    "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
    "allowJs": true,                       /* Allow javascript files to be compiled. */
    "outDir": "build",                        /* Redirect output structure to the directory. */
    "strict": true,                           /* Enable all strict type-checking options. */
  },
  "include": [
    "src/**/*.ts",
  ],
  "exclude": [
      "node_modules",
      "**/*.spec.ts"
  ]
}

index.d.ts

declare module "module-one";
declare module "module-two";
declare module "module-three";

package.json

{
  "dependencies": {
    "module-one": "^2.0.4",
    "module-two": "^1.3.3",
    "module-three": "0.0.3",
    "@types/lodash": "^4.14.129",
  },
  "devDependencies": {
    "@types/jest": "^24.0.13",
    "@types/node": "^9.6.0",
    "cpx": "^1.5.0",
    "jest": "^24.8.0",
    "ts-jest": "^24.0.2",
    "typescript": "^3.4.5"
  },
  "scripts": {
    "start": "cd build && node app.js",
    "test": "jest",
    "build": "tsc",
    "postinstall": "npm run-script build"
  },
}

Где tsc и jest ожидают index.d.ts?

Некоторые статьи, которые предложили создать один index.d.ts для каждого модуля, например ./types/module-one/index.d.ts, ./types/module-two/index.d.ts, ./types/module-three/index.d.ts а затем отредактируйте tsconfig.json compilerOptions.typeRoots включать ./types папка.

Но я хочу просто иметь 1 index.d.ts со всеми объявлениями.

Когда я редактирую tsconfig.json include включать index.d.ts файл, я считаю, что TSC может скомпилировать файлы в моей папке SRC. Однако, когда я запускаю jest, он все еще жалуется, что мой модуль index.d.ts отсутствует.

РЕДАКТИРОВАТЬ: Если я удаляю свой tsconfig.json, то jest будет работать правильно, не жалуясь на отсутствующий модуль, но тогда я не могу tsc собрать мои файлы src.

Если я сохраню tsconfig.json, то tsc соберет мои файлы src, но jest будет жаловаться, что модуль один не определен.

РЕДАКТИРОВАТЬ 2: я обнаружил, что если я установил [jest.config.ts].globals.ts-jest.diagnostics = false, то ошибка уходит и все мои тесты пройдены! Но я не думаю, что это правильное решение?

1 ответ

TLDR: по какой-то непонятной для обычного человека причине TypeScript ищет index.d.ts в каталоге, на который указывает параметр компилятора baseUrl!

Идиотский, но правильный ответ: «Вы должны поместить свой index.d.ts в то место, где его найдет транспайлер».

Ну не НАСТОЛЬКО идиотский. Просто помните, что копирование половины конфига из одного рабочего проекта и половины из другого, скорее всего, даст вам нерабочий конфиг.

Согласно этой статье я добавил в свой tsconfig.json

      {
    "compilerOptions": {
        "typeRoots": [ "./types", "./node_modules/@types"],
        ...
    },
    ...
}

упс, ничего не случилось.

Скорее всего, потому что «Кроме того, в этой статье предполагается, что вы используете TypeScript 2.x». - и я использую 3.x.

Тупой копипастинг никогда не работает должным образом.

Используя truss (аналог strace для FreeBSD), я обнаружил, что транспайлер полностью игнорирует мои typeRoots. Он искал мой index.d.ts в /node_modules/@types/vue-native-notification/index.d.ts — в моем каталоге src, в моем каталоге проекта, дома и так далее до /node_modules/@types/vue-родной-уведомление/index.d.ts

Хорошо, символическая ссылка моего src/types/vue-native-notification на node_modules/@types/vue-native-notification помогла, но это было не то, что мне нужно. Я не хочу исправлять свое дерево в соответствии с настройками транспилятора по умолчанию!

Согласно официальной документации , опция typesRoot была переименована в types. Очень микрософтовский.

Хорошо, я изменил типы Root на типы.

Теперь я не могу отследить чтение транспилером src/types/vue-native-notification/index.d.ts ... и выдает ту же ошибку!

Я написал несколько слов в index.d.ts и обнаружил, что он не компилируется. Действительно странно.

Без малейшей надежды я попробовал, казалось бы, бессмысленную идею установки baseUrl , но это помогло. Удаление опции компилятора типов ничего не изменило.

Я совершенно недоволен успехом, он выглядит довольно волшебно. Но это работает.

Другие вопросы по тегам