TypeScript
Next.js 内置 TypeScript,当你使用 create-next-app 创建新项目时,会自动安装必要的包并配置正确的设置。
要将 TypeScript 添加到现有项目,请将文件重命名为 .ts / .tsx。运行 next dev 和 next build 以自动安装必要的依赖项并添加具有推荐配置选项的 tsconfig.json 文件。
提示:如果你已经有
jsconfig.json文件,请将paths编译器选项从旧的jsconfig.json复制到新的tsconfig.json文件中,并删除旧的jsconfig.json文件。
IDE 插件
Next.js 包含一个自定义 TypeScript 插件和类型检查器,VSCode 和其他代码编辑器可以使用它进行高级类型检查和自动完成。
你可以通过以下方式在 VS Code 中启用插件:
- 打开命令面板(
Ctrl/⌘+Shift+P) - 搜索"TypeScript: Select TypeScript Version"
- 选择"Use Workspace Version"


现在,在编辑文件时,自定义插件将被启用。运行 next build 时,将使用自定义类型检查器。
TypeScript 插件可以帮助:
- 当传递 段配置选项 的无效值时发出警告。
- 显示可用选项和上下文文档。
- 确保正确使用
'use client'指令。 - 确保客户端钩子(如
useState)仅在客户端组件中使用。
🎥 观看:了解内置 TypeScript 插件 → YouTube (3 分钟)
端到端类型安全
Next.js App 路由具有增强的类型安全性。这包括:
- 获取函数和页面之间没有数据序列化:你可以在服务端的组件、布局和页面中直接
fetch。这些数据不需要序列化(转换为字符串)就可以传递给客户端供 React 使用。相反,由于app默认使用服务端组件,我们可以使用Date、Map、Set等值,而无需任何额外步骤。以前,你需要使用 Next.js 特定的类型手动键入服务端和客户端之间的边界。 - 组件之间的简化数据流:通过移除
_app而支持根布局,现在更容易可视化组件和页面之间的数据流。以前,在单个pages和_app之间流动的数据很难类型化,可能会引入令人困惑的错误。通过 App 路由中的 并置数据获取,这不再是问题。
Next.js 中的数据获取 现在提供了尽可能接近端到端类型安全的体验,而不会对你的数据库或内容提供商选择做出规定。
我们能够像你期望的那样使用普通 TypeScript 来类型化响应数据。例如:
- TypeScript
async function getData() {
const res = await fetch('https://api.example.com/...')
// 返回值 *不会*被序列化
// 你可以返回 Date、Map、Set 等
return res.json()
}
export default async function Page() {
const name = await getData()
return '...'
}
对于完整的端到端类型安全,这还需要你的数据库或内容提供商支持 TypeScript。这可以通过使用 ORM 或类型安全的查询构建器来实现。
示例
类型检查 next.config.ts
你可以通过使用 next.config.ts 在 Next.js 配置中使用 TypeScript 和导入类型。
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
/* 配置选项在这里 */
}
export default nextConfig
提示:
next.config.ts中的模块解析目前仅限于CommonJS。这可能会导致与仅在 ESM 包在next.config.ts中加载时的不兼容性。
使用 next.config.js 文件时,你可以使用 JSDoc 在 IDE 中添加一些类型检查,如下所示:
// @ts-check
/** @type {import('next').NextConfig} */
const nextConfig = {
/* 配置选项在这里 */
}
module.exports = nextConfig
静态类型化链接
Next.js 可以静态类型化链接,以防止在使用 next/link 时出现拼写错误和其他错误,提高在页面之间导航时的类型安全性。
要选择加入此功能,需要启用 experimental.typedRoutes 并且项目需要使用 TypeScript。
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
experimental: {
typedRoutes: true,
},
}
export default nextConfig
Next.js 将在 .next/types 中生成一个链接定义,其中包含有关应用程序中所有现有路由的信息,TypeScript 可以使用这些信息在编辑器中提供关于无效链接的反馈。
目前,实验性支持包括任何字符串字面量,包括动态段。对于非字面量字符串,你目前需要使用 as Route 手动转换 href:
import type { Route } from 'next';
import Link from 'next/link'
// 如果 href 是有效路由,则没有 TypeScript 错误
<Link href="/about" />
<Link href="/blog/nextjs" />
<Link href={`/blog/${slug}`} />
<Link href={('/blog' + slug) as Route} />
// 如果 href 不是有效路由,则 TypeScript 错误
<Link href="/about" />
要在包装 next/link 的 自定义组件中接受 href,请使用泛型:
import type { Route } from 'next'
import Link from 'next/link'
function Card<T extends string>({ href }: { href: Route<T> | URL }) {
return (
<Link href={href}>
<div>My Card</div>
</Link>
)
}
它是如何工作的?
当运行
next dev或next build时,Next.js 在.next内部生成一个 隐藏的.d.ts文件,其中包含有关应用程序中所有现有路由的信息(所有有效路由作为Link的href类型)。这个.d.ts文件包含在tsconfig.json中,TypeScript 编译器将检查该.d.ts文件并在编辑器中提供关于无效链接的反馈。
使用异步服务端组件
要在 TypeScript 中使用 async 服务端组件,请确保你使用的是 TypeScript 5.1.3 或更高版本和 @types/react 18.2.8 或更高版本。
如果你使用的是较旧版本的 TypeScript,你可能会看到 'Promise<Element>' is not a valid JSX element 类型错误。更新到最新版本的 TypeScript 和 @types/react 应该可以解决此问题。
增量类型检查
自 v10.2.1 起,Next.js 在 tsconfig.json 中启用时支持 增量类型检查,这可以帮助加速大型应用程序中的类型检查。
在生产环境中禁用 TypeScript 错误
当项目中存在 TypeScript 错误时,Next.js 会使你的生产构建(next build)失败。
如果你希望 Next.js 即使在应用程序有错误的情况下也能危险地生成生产代码,你可以禁用内置的类型检查步骤。
如果禁用,请确保你在构建或部署过程中运行类型检查,否则这可能非常危险。
打开 next.config.ts 并在 typescript 配置中启用 ignoreBuildErrors 选项:
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
typescript: {
// !! 警告 !!
// 危险地允许生产构建成功完成,即使 你的项目有类型错误。
// !! 警告 !!
ignoreBuildErrors: true,
},
}
export default nextConfig
提示:你可以运行
tsc --noEmit在构建前自己检查 TypeScript 错误。这对于 CI/CD 管道很有用,你希望在部署前检查 TypeScript 错误。
自定义类型声明
当你需要声明自定义类型时,你可能会想要修改 next-env.d.ts。但是,此文件是自动生成的,因此你进行的任何更改都会被覆盖。相反,你应该创建一个新文件,让我们称之为 new-types.d.ts,并在 tsconfig.json 中引用它:
{
"compilerOptions": {
"skipLibCheck": true
//...truncated...
},
"include": [
"new-types.d.ts",
"next-env.d.ts",
".next/types/**/*.ts",
"**/*.ts",
"**/*.tsx"
],
"exclude": ["node_modules"]
}
版本变更
| 版本 | 更改 |
|---|---|
v15.0.0 | 为 TypeScript 项目添加了 next.config.ts 支持。 |
v13.2.0 | 静态类型化链接在测试版中可用。 |
v12.0.0 | 现在默认使用 SWC 来编译 TypeScript 和 TSX 以获得更快的构建。 |
v10.2.1 | 在 tsconfig.json 中启用时添加了 增量类型检查 支持。 |