Файлы объявлений Typescript для локальных файлов JS

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

Вот моя файловая структура

  • JS
    • foo.js
  • типизации
    • Foo
      • index.d.ts
  • index.ts
  • package.json
  • tsconfig.json

foo.js

module.exports = function Foo() {
   return 'Bar';
 };

index.d.ts

export = Foo;

declare function Foo(): string;

index.ts

import Foo = require('./js/Foo')

console.log(Foo());

tsconfig.json

{
  "compilerOptions": {
    "typeRoots": ["./typings"],
    "target": "es5",
    "strict": true,
    "baseUrl": "./",
    "paths": {
      "*": ["typings/*"]
    }
  }
}

package.json

{
  "name": "fail",
  "version": "1.0.0",
  "description": "",
  "main": "index.ts",
  "scripts": {
    "tsc": "tsc"
  },
  "author": "",
  "license": "MIT",
  "dependencies": {
    "typescript": "^3.1.4"
  }
}

Вот репо, чтобы воспроизвести мою проблему

https://github.com/erisman20/typings_help

Редактировать: вот есть ошибка, которую я получаю

error TS7016: Could not find a declaration file for module './js/Foo.js'. '....../js/Foo.js' implicitly has an 'any' type.

1 ответ

Решение

Единственные способы предоставить объявления для относительного импорта, такие как './js/Foo' должны фактически иметь файл декларации в пути импорта (плюс .d.ts или же /index.d.ts) или иметь его практически в пути импорта на основе вашего rootDirs вариант. ни typeRoots ни baseUrl/paths вступает в игру по этому сценарию: baseUrl/paths влияет только на разрешение модуля для "не относительных" путей, и typeRoots может использоваться для получения TypeScript для загрузки файлов, но никак не влияет на связь между путями импорта и файлами.

Самое простое решение было бы поставить Foo.d.ts файл в том же каталоге, что и Foo.js, Если вы хотите сохранить набор текста в отдельном каталоге, вы можете добавить "rootDirs": ["js", "typings"] в tsconfig.json, Этого изменения достаточно, чтобы ваш пример работал на меня, хотя я нахожу запутанным наличие соответствующего Foo.js а также Foo/index.d.ts файлы и будет поощрять вас быть последовательными в использовании подкаталогов, т. е. либо переключиться на Foo/index.js на стороне JavaScript или переключиться на Foo.d.ts на стороне TypeScript.

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