我在我的项目中使用Typescript .如果我try 使用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""类型."如果存在,请try ‘npm i--save-dev@type/uuid’,或添加一个新的声明(.d.ts)文件,其中包含‘ECLARE MODULE’UUID‘;

我已经安装了@TYPE/UUID.

对于需要类型定义(@TYPE/*)的包,我确实遇到了这个问题

如果项目 struct 类似于以下示例:

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

要重新生成此问题,请运行下面提到的命令:

$ mkdir project
$ cd project
$ touch tsconfig.json

将以下json添加到tsfig.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上创建了一个issue.我终于发现,如果Package.json存在于项目的根中,我将永远不需要处理这样的问题.

示例:

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

我只在使用嵌套 struct 化项目(其中在根目录中不提供Package.json文件)时需要类型定义(@TYPES/*)的包中才会遇到这个问题.

该项目 struct 基于将AWS Lambda与层一起用于无服务器应用程序.这个"依赖"文件夹基本上是一个层,而AWS-lambda层被定义为这样的 struct

依赖项/Nodejs/Package.json

因此,不应将Package.json放在项目的根目录下.

然而,我认为这不是一个包问题,而是一个打字TSconfig问题.

我试图在tsconfig文件中定义typeRoots,但它不起作用.

以下是包含生成问题的示例项目的GitHub存储库:

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

我想使用ES6模块在嵌套 struct 项目中导入UUID,与我共享的相同.

推荐答案

我可以通过添加路径属性来修复该问题:

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

TypeRoot定义全局类型的路径.这基本上表明.d.ts文件包含DECLARE模块语法,而像UUID这样的包(类型定义)不包含.

Node.js相关问答推荐

使用Vite和ReactJS时,在哪里设置NODE_OPTIONS?

如何在node.js中以随机顺序调用函数并按顺序操作

为什么我收到此错误:MissingSchemaError:架构尚未为模型&业务&注册

获取页面大小为10的所有文章,每篇文章填充一些所需的用户信息

PEAN auth 应用程序:为什么 Angular 拦截器总是使用BehaviorSubject 返回 null(即初始值),而不是更新后的值?

遇到 - TypeError:try 使用 Express(Node.js) 从 JSON 文件访问数据时无法读取未定义的属性(读取帖子)

与诗乃一起嘲笑奈克斯

npm install 在 Mac 上的 Node-gyp 构建错误

如何为单个 mongo nodejs 驱动程序找到最佳连接池大小

如何在没有云功能的情况下使用 Google PubSub

如何使用来自前一阶段的另一个数组的聚合mongoose 在数组中添加字段

WSL2 上需要脚本运行的 NPM 包的权限被拒绝

node和mongoDB聚合数据时的输入字段函数

如何将使用 Gulp 的 node 部署到 heroku

我可以向NPM添加调试脚本吗?

如何以编程方式检测nodejs中的调试模式?

如何使用 gulp-uglify 缩小 ES6 函数?

对不同对象中的函数使用相同的键时,V8 中的函数调用缓慢

如何在 NodeJs 中下载和解压缩内存中的 zip 文件?

node.js 示例