TypeScript
Next.js 提供了一种以 TypeScript 为先导的开发体验,用于构建您的 React 应用程序。
它具有内置的 TypeScript 支持,可自动安装必要的软件包并配置正确的设置。
还有一个用于您的编辑器的 TypeScript 插件。
🎥 观看:了解内置 TypeScript 插件 → YouTube(3 分钟)
新项目
现在,create-next-app
默认使用 TypeScript 进行创建。
npx create-next-app@latest
现有项目
通过将文件重命名为 .ts
/ .tsx
将 TypeScript 添加到您的项目。
运行 next dev
和 next build
以自动安装必要的依赖项并添加一个带有推荐配置选项的 tsconfig.json
文件。
如果您已经有一个 jsconfig.json
文件,
请将旧的 jsconfig.json
中的 paths
编译器选项复制到新的 tsconfig.json
文件中,
并删除旧的 jsconfig.json
文件。
TypeScript 插件
Next.js 包含一个自定义的 TypeScript 插件和类型检查器, VSCode 和其他代码编辑器可以使用它进行高级类型检查和自动完成。
您可以在 VS Code 中启用该插件:
- 打开命令面板(
Ctrl/⌘ + Shift + P
) - 搜索 "TypeScript: Select TypeScript Version"
- 选择 "Use Workspace Version"
TypeScript 命令面板
现在,在编辑文件时,将启用自定义插件。运行 next build
时,将使用自定义类型检查器。
插件功能
TypeScript 插件可以帮助:
- 警告是否传递了段配置选项的无效值。
- 显示可用选项和上下文文档。
- 确保正确使用
use client
指令。 - 确保客户端钩子(如
useState
)仅在客户端组件中使用。
将来将添加更多功能。
最低 TypeScript 版本
强烈建议至少使用 TypeScript 的 v4.5.2
版本,以获取 import 名称上的类型修饰符和性能改进等语法功能。
静态类型链接
Next.js 可以在使用 next/link
时静态地为链接提供类型,以防止拼写错误和其他错误,
从而在页面之间导航时提高类型安全性。
要启用此功能,需要启用 experimental.typedRoutes
,并且项目需要使用 TypeScript。
/** @type {import('next').NextConfig} */
const nextConfig = {
experimental: {
typedRoutes: true,
},
}
module.exports = 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="/aboot" />
要在包装 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 会生成一个隐藏的 .d.ts
文件,
位于 .next
中,其中包含有关应用程序中所有现有路由的信息(Link
的 href
类型)。
此 .d.ts
文件已包含在 tsconfig.json
中,TypeScript 编译器将检查该 .d.ts
文件,
并在编辑器中提供有关无效链接的反馈。
端到端类型安全性
Next.js 13 增强了类型安全性。这包括:
- 在获取函数和页面之间不再对数据进行序列化:您可以在组件、布局和服务器上直接获取数据。此数据无需序列化(转换为字符串)即可传递到用于在 React 中使用的客户端。由于应用程序默认使用 Server Components,因此我们可以在没有任何额 外步骤的情况下使用诸如 Date、Map、Set 等值。以前,您需要手动为 Next.js 特定类型定义服务器和客户端之间的边界。
- 组件之间的数据流更加流畅:随着对根布局的移除,现在更容易可视化组件和页面之间的数据流。以前,在单个页面和根布局之间传递的数据难以定义,并且可能引入混乱的错误。在 Next.js 13 中,通过在一起放置数据获取,这不再是一个问题。
Next.js 现在提供了尽可能接近端到端类型安全的数据获取,而不会对您的数据库或内容提供者的选择进行规定。
我们能够像使用普通 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 或类型安全的查询构建器来实现。
异步服务器组件 TypeScript 错误
要在 TypeScript 中使用异步服务器组件,
请确保使用 TypeScript 的 v5.1.3
或更高版本以及 @types/react
的 v18.2.8
或更高版本。
如果使用较旧版本的 TypeScript,可能会看到 'Promise<Element>'
不是有效的 JSX 元素类型错误。
更新到最新版本的 TypeScript 和 @types/react
应该解决此问题。