我在我的项目中使用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": {
"*" : ["*"]
}
}
}`