introduction

Next.js 提供了一个TypeScript 开发体验,类似于一个IDE …

create-next-app的支持

你能够创建一个TypeScript 项目(通过create-next-app --ts或者--typescript标志

  1. npx create-next-app@latest --ts
  2. # or
  3. yarn create next-app --typescript

存在的项目

对于存在的项目转换为ts也是非常的简单,创建一个tsconfig.json到顶级目录中

  1. touch tsconfig.json

然后Next.js 将自动使用默认值填充该文件,你还可以在tsconfig.json中自定义编译器参数

你能够提供一个到tsconfig.json 文件的相对路径(通过 typescript.tsconfigPath属性到 next.config.js文件中)

Next.js 使用Babel 来处理TypeScript,因此有一些需要注意的事项(https://babeljs.io/docs/en/babel-plugin-transform-typescript#caveats) 和一些对编译器参数上处理的不同

然后运行next通常是npm run dev或者yarn dev,next.js 将引导你完成软件包的安装和配置..

  1. npm run dev
  2. # You'll see instructions like these:
  3. #
  4. # Please install TypeScript, @types/react, and @types/node by running:
  5. #
  6. # yarn add --dev typescript @types/react @types/node
  7. #
  8. # ...

现在我们可以将.js转换为.tsx然后充分利用ts带来的好处 ..

现在我们可以在根目录中创建next-env.d.ts文件,此文件确保TypeScript编辑器选择Next.js 的类型信息,此文件随时可能会改变,因此你不能删除或者编辑此文件 ..

默认情况下,TypeScript的strict模式是关闭的,如果你对Typescript 觉得适应,建议在tsconfig.json中将其开启 ..

除了编辑next-dev.d.ts,你还可以包含一些额外的类型(通过增加一个新的文件,例如additional.d.ts然后再tsconfig.json中的include引用它们 …

默认情况下,Next.js 将再next build阶段进行类型检查,我们建议你在开发过程中使用代码编辑器的类型检查功能 …

如果要关闭错误报告,请参考 忽略 TypeScript 报错

静态生成和服务端渲染

你能够分别使用getStaticProps,getStaticPaths或者getServerSideProps

  1. import { GetStaticProps, GetStaticPaths, GetServerSideProps } from 'next'
  2. export const getStaticProps: GetStaticProps = async (context) => {
  3. // ...
  4. }
  5. export const getStaticPaths: GetStaticPaths = async () => {
  6. // ...
  7. }
  8. export const getServerSideProps: GetServerSideProps = async (context) => {
  9. // ...
  10. }

如果使用的是getInitialProps,则可以查看 这个函数相关的介绍 ..

API 路由

以下是API 路由使用内置类型的示例

  1. import type { NextApiRequest, NextApiResponse } from 'next'
  2. export default (req: NextApiRequest, res: NextApiResponse) => {
  3. res.status(200).json({ name: 'John Doe' })
  4. }
  1. import type { NextApiRequest, NextApiResponse } from 'next'
  2. type Data = {
  3. name: string
  4. }
  5. export default (req: NextApiRequest, res: NextApiResponse<Data>) => {
  6. res.status(200).json({ name: 'John Doe' })
  7. }

自定义App

自定义App可以使用内置类型AppProps并将文件名改为./pages/_app.tsx,然后

  1. // import App from "next/app";
  2. import type { AppProps /*, AppContext */ } from 'next/app'
  3. function MyApp({ Component, pageProps }: AppProps) {
  4. return <Component {...pageProps} />
  5. }
  6. // Only uncomment this method if you have blocking data requirements for
  7. // every single page in your application. This disables the ability to
  8. // perform automatic static optimization, causing every page in your app to
  9. // be server-side rendered.
  10. //
  11. // MyApp.getInitialProps = async (appContext: AppContext) => {
  12. // // calls page's `getInitialProps` and fills `appProps.pageProps`
  13. // const appProps = await App.getInitialProps(appContext);
  14. // return { ...appProps }
  15. // }
  16. export default MyApp

路径别名和baseUrl

Next.js 自动支持tsconfig.jsonpath以及 baseUrl参数 ..

你可以在模块路径别名了解此功能的贡多信息 …

next.config.js 类型检查

next.config.js必须作为一个js 文件并没有打算让babel或者 typeScript进行解析或者处理,然而你能够增加某些类型检查(在JSDoc中使用) ..

  1. // @ts-check
  2. /**
  3. * @type {import('next').NextConfig}
  4. **/
  5. const nextConfig = {
  6. /* config options here */
  7. }
  8. module.exports = nextConfig

增量类型检查

V10.2.1Next.js 支持 incremental type checking (当在<font style="color:rgb(17, 17, 17);">tsconfig.json</font>中启用这个特性),它能够帮助在大型应用中进行类型检查 …

推荐使用<font style="color:rgb(17, 17, 17);">v4.3.2</font>的ts 体验最佳性能(当利用此特性的时候) …