Правильный способ обработки неопределенных файлов объявлений (index.д.ТС)

я получил следующую ошибку

error TS7016: Could not find a declaration file for module 'react-native-camera'. '/Users/ilja/Documents/Repositories/blok/node_modules/react-native-camera/index.js' implicitly has an 'any' type.
  Try `npm install @types/react-native-camera` if it exists or add a new declaration (.d.ts) file containing `declare module 'react-native-camera';`

в качестве быстрого исправления я создал typings/index.d.ts (нет файла @types / react-native-camera) в корне моего проекта и заполнил его

declare module 'react-native-camera';

затем, в моем файле tsconfig я добавил его в мои корни типа, как это

"typeRoots": ["node_modules/@types", "./typings"],

однако я все еще получаю ту же ошибку, когда я строю, заставляя меня думать, что моя реализация неверна, что я пропустил?

Edit, мой полный tsconfig выглядит так это

{
  "compilerOptions": {
    "target": "ES6",
    "module": "commonjs",
    "lib": ["es7"],
    "allowJs": true,
    "checkJs": true,
    "jsx": "react-native",
    "removeComments": true,
    "outDir": "./dist",
    "typeRoots": ["node_modules/@types", "./typings"],
    "experimentalDecorators": true,
    "noFallthroughCasesInSwitch": true,
    "noImplicitReturns": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "allowSyntheticDefaultImports": true,
    "strict": true
  },
  "exclude": ["./node_modules", "./android", "./ios", "./assets", "./__tests__", "./dist"],
  "include": ["./src"]
}

2 ответов


на typeRoots Options указывает, где искать пакетов, который может содержать информацию о типе. The документация продолжает говорить, что компилятор ищет пакетов.

я воспроизвел структуру, которую вы описали, и получил ту же ошибку, что и вы. Затем я создал react-native-camera под typings и двигался index.d.ts так что я в конечном итоге с этим структуру:

typings/
└── react-native-camera
    └── index.d.ts

С этой структурой, составление работает просто отлично.

С помощью typings структура каталогов в порядке, если вы хотите такую структуру. Для некоторых проектов я использую


С документ flowtype, раздела определений библиотеки, он сказал:

libdef-это специальный файл, который информирует поток о сигнатуре типа какого-либо конкретного стороннего модуля или пакета модулей, которые использует приложение. Если вы знакомы с языками, которые имеют заголовок файлы (например, C++), вы можете думать о libdefs как о аналогичной концепции.

Общие Рекомендации

попробуйте предоставить libdef для каждого сторонняя библиотека, используемая вашим проектом.

посмотреть в .flowconfig в корневом пути вы увидите, что он уже определен там.

[libs]
node_modules/react-native/Libraries/react-native/react-native-interface.js
node_modules/react-native/flow
./libdefs.js

а затем искать libdefs.js в корневом пути он должен быть там. Или просто создать его самостоятельно.

для каждого модуля, объявить его, как показано ниже. Взять rxjs например:

declare module 'rxjs' { declare var exports: any; }

это официальный способ предложения, нет .д.ТС изменить необходимый.