Eu li como funciona a resolução do módulo TypeScript .
Eu tenho o seguinte repositório: @ ts-stack / di . Depois de compilar, a estrutura de diretórios é a seguinte:
├── 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
No meu package.json eu escrevi "main": "dist/index.js"
.
No Node.js tudo funciona bem, mas o TypeScript:
import {Injector} from '@ts-stack/di';
Não foi possível encontrar um arquivo de declaração para o módulo '@ ts-stack / di'. '/path/to/node_modules/@ts-stack/di/dist/index.js' implicitamente tem um tipo 'any'.
E, no entanto, se eu importar da seguinte maneira, tudo funcionará:
import {Injector} from '/path/to/node_modules/@ts-stack/di/dist/index.js';
O que estou fazendo de errado?
typescript
node-modules
ktretyak
fonte
fonte
npm install @types/node --save-dev
require
vez deimport
é um pouco antipadrão: é melhor declarar o módulo em um.d.ts
arquivo; veja minha resposta abaixo.const mdbreact = require('mdbreact'); const { Button, Card, CardBody, CardText, CardTitle, CardImage } = mdbreact;
Se você estiver importando um módulo de terceiros
'foo'
que não fornece nenhuma digitação, na própria biblioteca ou no@types/foo
pacote (gerado a partir do repositório DefinitelyTyped ), poderá fazer com que esse erro desapareça, declarando o módulo em um arquivo com uma.d.ts
extensão. O TypeScript procura.d.ts
arquivos nos mesmos locais em que procurará.ts
arquivos normais : conforme especificado em "arquivos", "incluir" e "excluir" notsconfig.json
.Então, quando você importar,
foo
ele será digitado comoany
.Como alternativa, se você quiser rolar suas próprias digitações, poderá fazer isso também:
Então isso será compilado corretamente:
Você não precisa fornecer digitações completas para o módulo, apenas o suficiente para os bits que realmente está usando (e deseja digitações apropriadas), por isso é particularmente fácil se você estiver usando uma quantidade bastante pequena de API.
Por outro lado, se você não se importa com as tipologias de bibliotecas externas e deseja que todas as bibliotecas sem tipagens sejam importadas
any
, adicione-o a um arquivo com uma.d.ts
extensão:A vantagem (e a desvantagem) disso é que você pode importar absolutamente tudo e o TS será compilado.
fonte
d.ts
arquivos? você deve fornecer alguma configuração comotypeRoots
?.d.ts
arquivos nos mesmos locais em que procurará por.ts
arquivos normais : como "arquivos" especificados, "incluem" e "excluem" notsconfig.json
. Eu não recomendaria o usotypeRoots
para esse fim: isso se destina à localização de módulos de tipo externo (ou sejanode_modules/@types
), não de.d.ts
arquivos individuais ..d.ts
arquivo?Se você precisar de uma solução rápida, basta adicioná-lo antes da linha de sua importação:
fonte
error Do not use "// @ts-ignore" comments because they suppress compilation errors @typescript-eslint/ban-ts-ignore
Essa sensação quando você fica olhando por dois dias e fica assim: basta remover
.js
de"main": "dist/index.js"
dentropackage.json
e tudo funciona bem!UPD : esta resposta é relativa se você tiver seu próprio pacote npm, se não - veja minha resposta abaixo .
E se a resposta acima não resolvidos importação seu módulo, tente apenas adicionar
typings
empackage.json
:Obviamente, aqui pasta
dist
- é onde você armazena os arquivos do módulo.fonte
declare module "moduleName"
enquanto isso, colocarO TypeScript está basicamente implementando regras e adicionando tipos ao seu código para torná-lo mais claro e preciso devido à falta de restrições no Javascript. O TypeScript exige que você descreva seus dados, para que o compilador possa verificar seu código e encontrar erros. O compilador informará se você está usando tipos incompatíveis, se está fora do seu escopo ou tenta retornar um tipo diferente. Portanto, quando você usa bibliotecas e módulos externos com o TypeScript, eles precisam conter arquivos que descrevam os tipos nesse código. Esses arquivos são chamados de arquivos de declaração de tipo com uma extensão
d.ts
. A maioria dos tipos de declaração para módulos npm já está gravada e você pode incluí-los usandonpm install @types/module_name
(onde module_name é o nome do módulo cujos tipos você deseja incluir).No entanto, existem módulos que não têm suas definições de tipo e, para que o erro desapareça e importe o módulo usando
import * as module_name from 'module-name'
, crie uma pastatypings
na raiz do seu projeto, crie uma nova pasta com o nome do módulo e nesse pasta crie ummodule_name.d.ts
arquivo e escrevadeclare module 'module_name'
. Depois disso, basta ir ao seutsconfig.json
arquivo e adicionar"typeRoots": [ "../../typings", "../../node_modules/@types"]
ocompilerOptions
(com o caminho relativo apropriado para suas pastas) para permitir que o TypeScript saiba onde ele pode encontrar as definições de tipos de suas bibliotecas e módulos e adicionar uma nova propriedade"exclude": ["../../node_modules", "../../typings"]
ao arquivo. Aqui está um exemplo de como o seu arquivo tsconfig.json deve ficar:Ao fazer isso, o erro desaparecerá e você poderá seguir as regras mais recentes do ES6 e do TypeScript.
fonte
index.d.ts
. Fora isso, essa foi a única solução que funcionou para mim.Para qualquer pessoa que esteja lendo isso, tente renomear o arquivo .js para .ts
Editar: Você também pode adicionar
"allowJs": true
ao seu arquivo tsconfig.fonte
Dessa forma, funciona para mim:
1. adicione sua própria declaração em um arquivo de declaração como index.d.ts (talvez na raiz do projeto) 2. adicione seu index.d.ts ao tsconfig.json- editar: aspas necessárias em torno do nome do módulo
fonte
Eu tive o mesmo problema usando um módulo de nó com um aplicativo de reação escrito em texto datilografado. O módulo foi instalado com sucesso usando
npm i --save my-module
. Está escrito em javascript e exporta umaClient
classe.Com:
A compilação falha com o erro:
@types/my-module
não existe, então adicionei ummy-module.d.ts
arquivo ao lado do ondemy-module
é importado, com a linha sugerida. Eu recebi o erro:O cliente é realmente exportado e funciona normalmente se eu o usar em um aplicativo js. Além disso, a mensagem anterior me diz que o compilador está procurando no arquivo certo (
/node_modules/my-module/lib/index.js
está definido nomy-module/package.json
"main"
elemento).Resolvi o problema dizendo ao compilador que não me importo com implícito
any
, ou seja, definofalse
a seguinte linha dotsconfig.json
arquivo:fonte
simples de consertar é:
se você deseja declarar a interface do objeto (recomendável para um grande projeto), você pode usar:
Como usar isso? simples..
fonte
Eu também estava entendendo isso, fiquei confuso por um tempo, mesmo com o módulo e os tipos já instalados e recarregando meu IDE várias vezes.
O que o corrigiu no meu caso foi encerrar os processos do terminal, remover
node_modules
, limpar o cache do gerenciador de pacotes do nó e fazer um novoinstall
carregamento e, em seguida, recarregar o editor.fonte
Infelizmente, está fora de nossas mãos se o gravador de pacotes se incomoda com um arquivo de declaração. O que costumo fazer é ter um arquivo
index.d.ts
que contenha todos os arquivos de declaração ausentes de vários pacotes:Index.ts:
fonte
Foi isso que funcionou comigo.
npm install --save readline
fonte
Eu tentei de tudo aqui, mas para mim foi um problema completamente diferente: tive que remover das minhas
*.d.ts
instruções de importação:Depois de remover o erro foi embora ...
Esclarecimento : Quando declaramos um módulo em um
*.d.ts
arquivo, ele é automaticamente escolhido pelo compilador Typescript como um módulo ambiente (aquele que você não precisa importar explicitamente). Depois de especificar oimport ... from ...
, o arquivo agora se torna um módulo normal (ES6) e, portanto, não será coletado automaticamente. Portanto, se você ainda deseja que ele se comporte como um módulo ambiente , use um estilo de importação diferente, como:fonte
Simplesmente você pode importá-lo usando o seguinte código:
fonte