Typescript typeoot不检测类型定义



我在我的项目中使用TypeScript。如果我尝试使用commonJS

导入一个包
const { v4: uuidv4 } = require('uuid');

然后我在编译期间没有得到任何错误,但当我将其转换为ES6模块时,如

import { v4 as uuidv4 } from 'uuid'; 

得到如下编译错误:

找不到模块'uuid'的声明文件。'C:/Users/project/dependencies/nodejs/node_modules/uuid/dist/index.js'隐式地有一个'any'类型。如果存在的话,试试'npm i——save-dev @types/uuid',或者添加一个包含'declare module 'uuid'的新声明文件(.d.ts);

我已经安装了@types/uuid。

对于需要类型定义(@types/*)的包,我确实面临这个问题

如果项目结构类似下面的例子:

├── dependencies
│   └── nodejs
│       ├── package.json
│       ├── node_modules
│       └── package-lock.json
├── src
│   └── index.ts
├── tsconfig.json
└── .gitignore

要重新生成此问题,请运行以下命令:

$ mkdir project
$ cd project
$ touch tsconfig.json

添加以下json到tsconfig。json文件:

{
"compilerOptions": {
"target": "es2017",                       
"module": "commonjs",                     
"outDir": "./dist",
"strict": true,
"noImplicitAny": true,
"baseUrl": "./dependencies/nodejs/node_modules",
"typeRoots": ["./dependencies/nodejs/node_modules/@types"],
"esModuleInterop": true,
"inlineSourceMap": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": ["src/**/*"],
"exclude": ["dependencies", "**/*.spec.ts"]
}
$ mkdir dependencies/nodejs
$ mkdir src/models
$ cd dependencies/nodejs
$ npm init
$ npm i uuid
$ npm i -D @types/uuid typescript
$ cd ..
$ cd ..
$ cd src/models
$ touch index.ts
$ nano index.ts
import { v4 as uuid } from 'uuid'; // inline typescript error (same mentioned in the issue)
console.log(uuid()); 

uuid不支持ESM模块,我在uuid github上创建了一个问题。我终于找到了那个包裹。. json存在于项目的根目录,我将永远不必处理这样的问题。

的例子:

├── src
│   └── index.ts
├── dist (or build
├── node_modules
├── package.json
├── package-lock.json 
└── .gitignore

我只有在使用嵌套的结构化项目时才面临需要类型定义(@types/*)的包的问题。Json文件在根目录中不可用)。

项目结构基于使用AWS Lambda和无服务器应用程序的层。这个"依赖关系"文件夹基本上是一个层,AWS-lambda层是用这样的结构定义的,如

依赖/nodejs package.json

因此,包。Json不应该放在项目的根目录。

然而,我相信这不是一个包的问题,而是一个typescript TSconfig的问题。

我试图在tsconfig文件中定义typeroot,但它不工作。

下面是github存储库,其中包含产生问题的示例项目:

https://github.com/sulemanelahi/typescript-type-definition

我想使用ES6模块在嵌套结构项目中导入uid,与我共享的相同。

以下内容适合我

import { v4 as uuidv4 }  from 'uuid/index';

推理:

运行
tsc --traceResolution

有跟踪

File '.../dependencies/nodejs/node_modules/@types/uuid.ts' does not exist.
File '.../dependencies/nodejs/node_modules/@types/uuid.tsx' does not exist.
File '.../dependencies/nodejs/node_modules/@types/uuid.d.ts' does not exist.

扩展这个逻辑放入

"typeRoots": ["dependencies/nodejs/node_modules/@types/**/index.d.ts"],

允许返回

import { v4 as uuidv4 }  from 'uuid';

更新:我还设置了

"baseUrl": "./dependencies/nodejs/node_modules/@types"

允许

"typeRoots": ["**/*.d.ts"],

我可以通过添加paths属性来解决这个问题:

"baseUrl": "./dependencies/nodejs/node_modules",    
"paths": {
"uuid": ["./@types/uuid"]
}

typeroot定义全局类型的路径。这基本上表示。d。ts文件包含declare模块语法,而@types/UUID之类的(类型定义的)包则没有。

更新:我使用了@Andrew Allen的解决方案,他在回答下面的评论部分提到了他从这个github评论中得到的答案(Andrew没有在回答中更新它)。

这也解决了这个问题,最好写下每个类型定义包的路径。

{
"compilerOptions": {
"target": "es5"
"baseUrl": "./dependencies/nodejs/node_modules",
"paths": {
"*" : ["*"]
}
}
}`

相关内容

  • 没有找到相关文章

最新更新