Leí cómo TypeScript funciona la resolución del módulo .
Tengo el siguiente repositorio: @ ts-stack / 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-stack/di';
No se pudo encontrar un archivo de declaración para el módulo '@ ts-stack / di'. '/path/to/node_modules/@ts-stack/di/dist/index.js' implícitamente tiene un tipo 'any'.
Y sin embargo, si importo de la siguiente manera, entonces todo funciona:
import {Injector} from '/path/to/node_modules/@ts-stack/di/dist/index.js';
¿Qué estoy haciendo mal?
typescript
node-modules
ktretyak
fuente
fuente
npm install @types/node --save-dev
require
lugar deimport
es un poco anti-patrón: es mejor declarar el módulo en un.d.ts
archivo; mira mi respuesta a continuación.const mdbreact = require('mdbreact'); const { Button, Card, CardBody, CardText, CardTitle, CardImage } = mdbreact;
Si está importando un módulo de terceros
'foo'
que no proporciona ninguna tipificación, ya sea en la propia biblioteca o en el@types/foo
paquete (generado desde el repositorio DefinitelyTyped ), puede hacer que este error desaparezca declarando el módulo en un archivo con una.d.ts
extensión. TypeScript busca.d.ts
archivos en los mismos lugares donde buscará.ts
archivos normales : como se especifica en "archivos", "incluir" y "excluir" en eltsconfig.json
.A continuación, cuando se importa
foo
sólo va a escribir comoany
.Alternativamente, si desea obtener sus propios tipos, también puede hacerlo:
Entonces esto se compilará correctamente:
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 importar todas las bibliotecas sin tipos
any
, puede agregar esto a un archivo con una.d.ts
extensión:El beneficio (y el inconveniente) de esto es que puede importar absolutamente cualquier cosa y TS compilará.
fuente
d.ts
archivos? ¿Debería proporcionar alguna configuración comotypeRoots
?.d.ts
archivos en los mismos lugares que buscará.ts
archivos normales : como se especifica "archivos", "incluir" y "excluir" en eltsconfig.json
. No recomendaría usartypeRoots
para este propósito: está destinado a la ubicación de módulos de tipo externo (es decirnode_modules/@types
), no a.d.ts
archivos individuales ..d.ts
archivo?Si necesita una solución rápida, simplemente agregue esto antes de la línea de importación:
fuente
error Do not use "// @ts-ignore" comments because they suppress compilation errors @typescript-eslint/ban-ts-ignore
Esa sensación cuando usted está buscando a cabo durante dos días y encontrar de esta manera: basta con retirar
.js
a partir"main": "dist/index.js"
depackage.json
y todo funciona muy bien!UPD : esta respuesta relativa si tiene su propio paquete npm, si no, vea mi respuesta a continuación .
Y si la respuesta anterior no resuelve el módulo de importación, trate sólo tiene que añadir
typings
enpackage.json
:Por supuesto, aquí carpeta
dist
: es donde almacena los archivos de su módulo.fuente
declare module "moduleName"
mientras tantoTypeScript 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 los módulos npm ya están escritos y puede incluirlos usandonpm 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 carpetatypings
en la raíz de su proyecto, dentro cree una nueva carpeta con el nombre de su módulo y en ese carpeta crea unmodule_name.d.ts
archivo y escribedeclare module 'module_name'
. Después de esto, simplemente vaya a sutsconfig.json
archivo y agregue"typeRoots": [ "../../typings", "../../node_modules/@types"]
elcompilerOptions
(con la ruta relativa adecuada a 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"]
al archivo. Aquí hay un ejemplo de cómo debería verse su archivo tsconfig.json:Al hacer esto, el error desaparecerá y podrá apegarse a las últimas reglas de ES6 y TypeScript.
fuente
index.d.ts
. Aparte de eso, esta fue la única solución que funcionó para mí.Para cualquier otra persona que lea esto, intente cambiar el nombre de su archivo .js a .ts
Editar: también puede agregar
"allowJs": true
a su archivo tsconfig.fuente
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) 2. agregue su index.d.ts a tsconfig.json- editar: comillas necesarias alrededor del nombre del módulo
fuente
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 unaClient
clase.Con:
La compilación falla con el error:
@types/my-module
no existe, así que agregué unmy-module.d.ts
archivo al lado del quemy-module
se importa, con la línea sugerida. Entonces recibí el error: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
se define en elmy-module/package.json
"main"
elemento).Resolví el problema diciéndole al compilador que no me importa lo implícito
any
, es decir, configuréfalse
la siguiente línea deltsconfig.json
archivo:fuente
fácil de arreglar es:
si desea declarar la interfaz del objeto (Recomendado para un gran proyecto) puede usar:
¿Cómo usar eso? sencillo..
fuente
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 memoria caché del administrador de paquetes de nodos yinstall
volver a cargar el editor.fuente
Desafortunadamente está fuera de nuestras manos si el escritor del paquete se molesta con un archivo de declaración. Lo que tiendo a hacer es tener un archivo
index.d.ts
que contendrá todos los archivos de declaración que faltan de varios paquetes:Index.ts:
fuente
Esto es lo que funcionó de mí.
npm install --save readline
fuente
He intentado todo aquí, pero para mí fue un problema completamente diferente: tuve que eliminar de mis
*.d.ts
declaraciones de importación:Después de eliminar el error desapareció ...
Aclaración : cuando declaramos un módulo en un
*.d.ts
archivo, el compilador mecanografiado lo recoge automáticamente como un módulo ambiental (el que no necesita importar explícitamente). Una vez que especificamosimport ... from ...
, el archivo ahora se convierte en un módulo normal (ES6) y, por lo tanto, no se recogerá automáticamente. Por lo tanto, si aún desea que se comporte como un módulo ambiental , use un estilo de importación diferente de esta manera:fuente
Simplemente puede importarlo usando require como el siguiente código:
fuente