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