javascript - Typescript não consegue encontrar tipo no arquivo de definição na pasta node_modules
Eu tenho um projeto que tem esta estrutura:
project/
├── package.config
├── node_modules/
│ ├── interactjs/
│ ├── ├── index.d.ts
├── src/
│ ├── browser/
│ | ├── tsconfig.json
│ | ├── index.ts
Eu tenho o seguinte ./package.json:
{
...
"dependencies": {
"interactjs": "1.3.4"
},
"devDependencies": {
"typescript": "3.2.2"
}
}
Meu ./src/browser/tsconfig.json é:
{
"compilerOptions": {
"target": "es5",
"module": "none",
"declaration": true,
"strict": true,
"strictNullChecks": false,
"outDir": "./out"
},
"typeRoots": [
"../../node_modules",
"../../node_modules/@types",
"../definitions"
],
"include": [
"./**/*"
]
}
Como você pode ver, estou incluindo também a pasta definitions, já que há algumas definições manuais que quero incluir em todos os arquivos TypeScript do meu projeto.
Problema
O seguinte falha na compilação:
const p : interact.Position = { x: 1, y: 2 };
Com erro:
index.ts:9:11 - error TS2503: Cannot find namespace 'interact'.
9 const s : interact.Position = { x: 1, y: 2 };
~~~~~~~~
interact não é encontrado, mesmo que no arquivo node_modules/interactjs o index.d.ts esteja presente com todas as definições.
Qual é o problema?
Resposta #1
Se você desejar manter a resolução de módulo como none, adicionar o arquivo de tipagem na seção "include" deve fornecer o resultado desejado.
tsconfig.json
{
"compilerOptions": {
"target": "es5",
"module": "none",
"declaration": true,
"strict": true,
"strictNullChecks": false,
"outDir": "./out",
"noImplicitAny": false //<------ to ignore the errors in interactjs/index.d.ts
},
"typeRoots": [
"../../node_modules",
"../../node_modules/@types",
"../definitions"
],
"include": [
"../../node_modules/interactjs/index.d.ts", //<----- include interact in the global scope
"./**/*"
]
}
index.ts
const p : interact.Position = { x: 1, y: 2 };
const s : interact.SnapPosition = { x: 1, y: 2, range: 0 };
const listener : interact.Listener = (e: interact.InteractEvent)=>{
console.log(e);
};
interact.on("cancel", listener)
construído index.js
"use strict";
var p = { x: 1, y: 2 };
var s = { x: 1, y: 2, range: 0 };
var listener = function (e) {
console.log(e);
};
interact.on("cancel", listener);
Resposta #2
Quando você importa um pacote, o Typescript (e o Node) determinam de qual arquivo/módulo importar desse pacote procurando um campo main no arquivo package.json incluído com o pacote. O arquivo package.json no interactjs inclui esta linha:
"main": "dist/interact.js",
Isso significa que o módulo principal no pacote interactjs se chama interact.js e está no diretório dist/.
Se o arquivo package.json do pacote não especificar explicitamente a localização de um arquivo de definição de tipos, o Typescript assumirá que o arquivo de definição de tipos tem o mesmo nome base e localização que o módulo principal do pacote. Dada a localização do módulo principal no interactjs, o Typescript procurará definições de tipos no arquivo dist/interact.d.ts. Tente renomear o arquivo de definição de tipos de index.d.ts para interact.d.ts e certifique-se de que ele esteja no diretório dist/.
Se você está criando um pacote que inclui definições de Typescript, é útil tornar explícita a localização do arquivo de definição incluindo um campo types no seu campo package.json, como é descrito no guia de publicação
