not node_modules namespace exclude augmentation typescript node-modules

typescript - node_modules - No se pudo encontrar un archivo de declaración para el módulo ''nombre-módulo''. ''/path/to/module-name.js'' implícitamente tiene un tipo ''any''



typescript module augmentation (9)

Aquí hay otras dos soluciones.

Cuando un módulo no es suyo, intente instalar tipos de @types :

npm install -D @types/module-name

Si los errores de instalación anteriores intentan cambiar las declaraciones de import para require :

// import * as yourModuleName from ''module-name''; const yourModuleName = require(''module-name'');

Leí cómo funciona la resolución del módulo TypeScript.

Tengo el siguiente repositorio: ts-di . Después de compilar la estructura del directorio es la siguiente:

├── dist │   ├── annotations.d.ts │   ├── annotations.js │   ├── index.d.ts │   ├── index.js │   ├── injector.d.ts │   ├── injector.js │   ├── profiler.d.ts │   ├── profiler.js │   ├── providers.d.ts │   ├── providers.js │   ├── util.d.ts │   └── util.js ├── LICENSE ├── package.json ├── README.md ├── src │   ├── annotations.ts │   ├── index.ts │   ├── injector.ts │   ├── profiler.ts │   ├── providers.ts │   └── util.ts └── tsconfig.json

En mi package.json escribí "main": "dist/index.js" .

En Node.js todo funciona bien, pero TypeScript:

import {Injector} from ''ts-di'';

No se pudo encontrar un archivo de declaración para el módulo ''ts-di''. ''/path/to/node_modules/ts-di/dist/index.js'' tiene implícitamente un tipo ''any''.

Y sin embargo, si importo de la siguiente manera, todo funciona:

import {Injector} from ''/path/to/node_modules/ts-di/dist/index.js'';

¿Qué estoy haciendo mal?


Esa sensación cuando está buscando dos días y la encuentra así: simplemente elimine .js de "main": "dist/index.js" en package.json y todo funciona bien.

"main": "dist/index",

UPD : esta respuesta relativa si tiene su propio paquete npm, si no, vea mi respuesta a continuación .

Y si la respuesta anterior no se resuelve, importe su módulo, intente simplemente agregar typings en package.json :

"main": "dist/index", "typings": "dist/index",

Por supuesto, aquí la carpeta dist es donde almacena los archivos de su módulo.


Esta manera funciona para mí:

1. agregue su propia declaración en un archivo de declaración como index.d.ts (tal vez debajo de la raíz del proyecto)

declare module Injector; 2. agregue su index.d.js a tsconfig.json

{ "compilerOptions": { "strictNullChecks": true, "moduleResolution": "node", "jsx": "react", "noUnusedParameters": true, "noUnusedLocals": true, "allowSyntheticDefaultImports":true, "target": "es5", "module": "ES2015", "declaration": true, "outDir": "./lib", "noImplicitAny": true, "importHelpers": true }, "include": [ "src/**/*", "index.d.ts", // declaration file path ], "compileOnSave": false }


Si está importando un módulo ''foo'' terceros que no proporciona ninguna tipificación, ya sea en la biblioteca en sí o en el paquete @types/foo (generado desde el repositorio DefinitelyTyped ), puede hacer que este error desaparezca lejos declarando el módulo en un archivo con una extensión .d.ts :

// foo.d.ts declare module ''foo'';

Luego, cuando importe foo , simplemente se escribirá como any .

Alternativamente, si desea obtener sus propios tipos, también puede hacerlo:

// foo.d.ts declare module ''foo'' { export function getRandomNumber(): number }

Entonces esto se compilará correctamente:

import { getRandomNumber } from ''foo''; const x = getRandomNumber(); // x is inferred as number

No tiene que proporcionar tipificaciones completas para el módulo, solo lo suficiente para los bits que realmente está utilizando (y desea las tipificaciones adecuadas), por lo que es particularmente fácil de hacer si está utilizando una cantidad bastante pequeña de API.

Por otro lado, si no le importan los tipos de bibliotecas externas y desea que se importen todas las bibliotecas sin tipos, puede agregar esto a un archivo con la extensión .d.ts :

declare module ''*'';

El beneficio (y el inconveniente) de esto es que puede importar absolutamente cualquier cosa y TS compilará.


Si necesita una solución rápida, simplemente agregue esto antes de importar:

// @ts-ignore


También estaba recibiendo esto, me desconcertó por un tiempo, incluso con el módulo y los tipos ya instalados y recargando mi IDE varias veces.

Lo que lo solucionó en mi caso fue terminar los procesos de la terminal, eliminar node_modules , borrar la caché del administrador de paquetes de nodos y realizar una install nueva y luego volver a cargar el editor.


Tuve el mismo problema al usar un módulo de nodo con una aplicación de reacción escrita en mecanografiado. El módulo se instaló correctamente usando npm i --save my-module . Está escrito en javascript y exporta una clase de Client .

Con:

import * as MyModule from ''my-module''; let client: MyModule.Client = new MyModule.Client();

La compilación falla con el error:

Could not find a declaration file for module ''my-module''. ''[...]/node_modules/my-module/lib/index.js'' implicitly has an ''any'' type. Try `npm install @types/my-module` if it exists or add a new declaration (.d.ts) file containing `declare module ''my-module'';`

@types/my-module no existe, así que agregué un archivo my-module.d.ts junto al que se importa my-module , con la línea sugerida. Entonces recibí el error:

Namespace ''"my-module"'' has no exported member ''Client''.

El cliente se exporta realmente y funciona normalmente si lo uso en una aplicación js. Además, el mensaje anterior me dice que el compilador está buscando en el archivo correcto ( /node_modules/my-module/lib/index.js está definido en el elemento "main" my-module/package.json ).

Resolví el problema diciéndole al compilador que no me importa any implícito, es decir, configuré como false la siguiente línea del archivo tsconfig.json :

"noImplicitAny": false,


TypeScript básicamente está implementando reglas y agregando tipos a su código para hacerlo más claro y más preciso debido a la falta de restricciones en Javascript. TypeScript requiere que describa sus datos, para que el compilador pueda verificar su código y encontrar errores. El compilador le informará si está utilizando tipos no coincidentes, si está fuera de su alcance o si intenta devolver un tipo diferente. Por lo tanto, cuando utiliza bibliotecas y módulos externos con TypeScript, deben contener archivos que describan los tipos en ese código. Esos archivos se denominan archivos de declaración de tipo con una extensión d.ts La mayoría de los tipos de declaración para módulos npm ya están escritos y puede incluirlos usando npm install @types/module_name (donde module_name es el nombre del módulo cuyos tipos desea incluir).

Sin embargo, hay módulos que no tienen sus definiciones de tipo y para que el error desaparezca e importe el módulo usando import * as module_name from ''module-name'' , cree una carpeta typings en la raíz de su proyecto, dentro cree una nueva carpeta con el nombre de su módulo y en esa carpeta cree un archivo module_name.d.ts y escriba declare module ''module_name'' . Después de esto, simplemente vaya a su archivo tsconfig.json y agregue "typeRoots": [ "../../typings", "../../node_modules/@types"] en compilerOptions (con la ruta relativa adecuada para sus carpetas) para que TypeScript sepa dónde puede encontrar las definiciones de tipos de sus bibliotecas y módulos y agregar una nueva propiedad "exclude": ["../../node_modules", "../../typings"] a el archivo. Aquí hay un ejemplo de cómo debería verse su archivo tsconfig.json:

{ "compilerOptions": { "module": "commonjs", "noImplicitAny": true, "sourceMap": true, "outDir": "../dst/", "target": "ESNEXT", "typeRoots": [ "../../typings", "../../node_modules/@types" ] }, "lib": [ "es2016" ], "exclude": [ "../../node_modules", "../../typings" ] }

Al hacer esto, el error desaparecerá y podrá apegarse a las últimas reglas de ES6 y TypeScript.


npm install --save typescript @types/node @types/react @types/react-dom @types/jest

o

yarn add typescript @types/node @types/react @types/react-dom @types/jest