Skip to content

解决 TypeScript 中 "Cannot find module" 错误

问题描述

在使用 TypeScript 开发时,当安装并导入第三方包 ts-transformer-keys 时,出现了以下错误:

text
Cannot find module 'ts-transformer-keys'. Did you mean to set the 'moduleResolution' option to 'node', or to add aliases to the 'paths' option?ts(2792)

尽管已经通过包管理器(如 yarn 或 npm)正确安装了该依赖,但 TypeScript 编译器仍然无法找到模块。

根本原因

这个错误的核心原因是 TypeScript 的模块解析策略配置不正确。默认情况下,TypeScript 可能使用经典的模块解析方式,这种方式不会从 node_modules 目录中查找模块。

模块解析机制

TypeScript 有两种主要的模块解析策略:

  • classic: 传统的 TypeScript 解析方式
  • node: 模拟 Node.js 的模块解析机制
  • node16: 适用于 Node.js 16+ 的模块解析

解决方案

方法一:配置 moduleResolution

tsconfig.json 文件中添加或修改 moduleResolution 选项:

json
{
  "compilerOptions": {
    // 其他配置...
    "moduleResolution": "node16"
  }
}

版本选择

  • 对于 Node.js 16+ 项目,使用 "node16"
  • 对于较旧的项目,可以使用 "node"

方法二:重启开发环境

在修改 tsconfig.json 后,如果问题仍然存在,尝试重启 VS Code 或其他开发环境:

  1. 关闭 VS Code
  2. 重新打开项目
  3. 等待 TypeScript 服务器重新初始化

注意

某些开发环境需要重启才能应用配置文件的更改,特别是在现有项目中首次添加 TypeScript 支持时。

方法三:JavaScript 项目的配置

对于 JavaScript 项目(而非 TypeScript),需要在项目根目录创建 jsconfig.json 文件:

json
{
  "compilerOptions": {
    "moduleResolution": "node16"
  }
}
快速定位配置文件

在 VS Code 中,查看状态栏上的 {} JavaScript{} TypeScript 图标,悬停在 {} 上可以快速打开配置文件。

完整配置示例

以下是一个包含必要设置的完整 tsconfig.json 示例:

json
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "moduleResolution": "node16",
    "esModuleInterop": true,
    "strict": true,
    "plugins": [
      { "transform": "ts-transformer-keys/transformer" }
    ]
  }
}

工作原理

当设置 moduleResolution: "node16" 后,TypeScript 编译器会按照 Node.js 的模块解析算法来查找模块:

  1. 首先检查当前目录的 node_modules
  2. 然后逐级向上查找父目录的 node_modules
  3. 最后在全局安装的模块中查找

这使得 TypeScript 能够正确找到安装在 node_modules 中的第三方包。

总结

遇到 "Cannot find module" 错误时,首先检查 tsconfig.json 中的 moduleResolution 配置。对于现代 Node.js 项目,建议使用 "node16" 选项,并确保在修改配置后重启开发环境以应用更改。

通过正确配置模块解析策略,TypeScript 将能够正确识别和导入第三方依赖,解决模块找不到的问题。