TypeScript
类型检查
默认情况下,为了性能考虑,Nuxt 在运行 nuxt dev 或 nuxt build 时不会进行类型检查。
要在构建或开发时启用类型检查,请将 vue-tsc 和 typescript 安装为开发依赖:
npm install --save-dev vue-tsc typescript
yarn add --dev vue-tsc typescript
pnpm add -D vue-tsc typescript
bun add -D vue-tsc typescript
然后,运行 nuxt typecheck 命令来检查你的类型:
npx nuxt typecheck
你也可以在 nuxt.config 文件中使用 typescript.typeCheck 选项来在构建或开发时启用类型检查:
export default defineNuxtConfig({
typescript: {
typeCheck: true,
},
})
自动生成的类型
当你运行 nuxt dev 或 nuxt build 时,Nuxt 会生成以下文件以支持 IDE 类型提示(以及类型检查):
.nuxt/nuxt.d.ts
该文件包含你正在使用的任何模块的类型,以及 Nuxt 所需的关键类型。你的 IDE 应该能自动识别这些类型。
文件中的一些引用指向仅在你的 buildDir(.nuxt)内生成的文件,因此要获得完整的类型信息,你需要运行 nuxt dev 或 nuxt build。
.nuxt/tsconfig.app.json
该文件包含针对你的项目的推荐基础 TypeScript 配置,包括由 Nuxt 或你使用的模块注入的已解析别名,因此你可以获得完整的类型支持以及像 ~/file 或 #build/file 这类别名的路径自动完成。
imports 部分来包含默认目录之外的目录。这对于自动导入在应用中广泛使用的类型非常有用。./.nuxt/tsconfig.json。不过,我们建议使用带有新配置文件(.nuxt/tsconfig.app.json、.nuxt/tsconfig.server.json 等)的TypeScript 项目引用,以获得更好的类型安全性和性能。如果你确实从 ./.nuxt/tsconfig.json 扩展,请记住所有选项将被你在 tsconfig.json 中定义的选项覆盖。用你自己的配置覆盖诸如 "compilerOptions.paths" 之类的选项会导致 TypeScript 不考虑这些模块解析,这可能会导致诸如 #imports 之类的模块解析无法识别。如果你需要进一步扩展选项,可以在 nuxt.config 中使用 alias 属性。Nuxt 会采集这些别名并相应地扩展生成的 TypeScript 配置。项目引用
Nuxt 使用 TypeScript 项目引用 来提高类型检查性能并提供更好的 IDE 支持。此功能允许 TypeScript 将代码库拆分为更小、更易管理的部分。
Nuxt 如何使用项目引用
当你运行 nuxt dev 或 nuxt build 时,Nuxt 会为应用的不同部分生成多个 tsconfig.json 文件。
.nuxt/tsconfig.app.json- 针对你的应用代码的配置.nuxt/tsconfig.node.json- 针对你的nuxt.config和模块的配置.nuxt/tsconfig.server.json- 针对服务器端代码的配置(在适用情况下).nuxt/tsconfig.shared.json- 针对在应用和服务器上下文之间共享的代码(如类型和与环境无关的实用工具).nuxt/tsconfig.json- 用于向后兼容的旧版配置
这些文件中的每一个都被配置为引用适当的依赖并为其特定上下文提供最佳的类型检查。
项目引用的好处
- 更快的构建:TypeScript 可以跳过未更改项目的重建
- 更好的 IDE 性能:你的 IDE 可以提供更快的 IntelliSense 和错误检查
- 隔离的编译:应用某一部分的错误不会阻止其他部分的编译
- 更清晰的依赖管理:每个项目明确声明其依赖关系
使用项目引用增强类型
由于项目被划分为多个类型上下文,重要的是在正确的上下文中增强类型,以确保它们被正确识别。
例如,如果你想增强 app 上下文的类型,增强文件应放在 app/ 目录中。
类似地:
- 对于
server上下文,请将增强文件放在server/目录中。 - 对于在应用和服务器之间共享的类型,请将文件放在
shared/目录中。
严格检查
TypeScript 提供了某些检查,以便为你的程序提供更多安全性和分析。
在 Nuxt 中,严格检查 默认启用,以为你提供更强的类型安全性。
如果你正在将代码库迁移到 TypeScript,可能希望临时通过在 nuxt.config 中将 strict 设置为 false 来禁用严格检查:
export default defineNuxtConfig({
typescript: {
strict: false,
},
})