# 创建 TS 项目

URL: https://caijiao.org/fastify/typescript/project-setup
Source: docs/fastify/typescript/project-setup.md
Description: 介绍如何在 Fastify 中创建一个 TypeScript 项目，包括配置步骤、基本示例和常见的开发实践。

[Fastify](/fastify/) 完美支持 TypeScript，可以轻松将 TypeScript 集成到 Fastify 项目中。以下是如何在 Fastify 中创建一个 TypeScript 项目的详细步骤。

## 1. 初始化项目

首先，使用 `npm init` 初始化一个新的 Node.js 项目，并安装必要的依赖：

```bash
mkdir fastify-ts-project
cd fastify-ts-project
npm init -y
```

接下来，安装 Fastify 和 TypeScript 相关依赖：

```bash
npm install fastify
npm install typescript ts-node @types/node --save-dev
```

- `fastify`: Fastify 框架的核心包。
- `typescript`: TypeScript 编译器。
- `ts-node`: 允许直接运行 TypeScript 文件的工具。
- `@types/node`: Node.js 的类型定义文件。

## 2. 配置 TypeScript

创建一个 `tsconfig.json` 文件，配置 TypeScript 编译选项：

```bash
npx tsc --init
```

然后，修改 `tsconfig.json` 文件，确保设置正确：

```json
{
  "compilerOptions": {
    "target": "ES2020",                // 设置目标 ECMAScript 版本
    "module": "CommonJS",              // 使用 CommonJS 模块
    "strict": true,                    // 启用严格类型检查
    "esModuleInterop": true,           // 允许默认导入非 ES6 模块
    "skipLibCheck": true,              // 跳过库的类型检查
    "forceConsistentCasingInFileNames": true,
    "outDir": "./dist",                // 编译后的文件输出目录
    "baseUrl": ".",                    // 设置基础目录
    "paths": {
      "*": ["node_modules/*"]          // 配置路径映射
    }
  },
  "include": [
    "src/**/*.ts"                       // 包含 src 文件夹下的所有 .ts 文件
  ],
  "exclude": [
    "node_modules"                      // 排除 node_modules 文件夹
  ]
}
```

### 说明

- `outDir`: 编译后输出的文件夹路径，通常设置为 `dist` 目录。
- `include`: 包含需要编译的 TypeScript 文件。

## 3. 创建 Fastify 应用

在 `src` 目录下创建一个 `index.ts` 文件，并编写一个简单的 Fastify 服务器：

```bash
mkdir src
touch src/index.ts
```

然后在 `src/index.ts` 中编写以下代码：

```typescript
import fastify from 'fastify';

const app = fastify();

app.get('/', async (request, reply) => {
  return { hello: 'world' };
});

app.listen(3000, (err, address) => {
  if (err) {
    app.log.error(err);
    process.exit(1);
  }
  app.log.info(`Server listening at ${address}`);
});
```

这段代码创建了一个简单的 Fastify 服务器，当访问根路径时返回 `{ hello: 'world' }`。

## 4. 添加开发脚本

在 `package.json` 中，添加以下开发脚本，以便使用 `ts-node` 启动项目：

```json
{
  "scripts": {
    "dev": "ts-node src/index.ts",
    "build": "tsc",
    "start": "node dist/index.js"
  }
}
```

- `dev`: 使用 `ts-node` 启动 TypeScript 项目，适用于开发环境。
- `build`: 编译 TypeScript 项目。
- `start`: 启动编译后的 [JavaScript](/javascript/) 项目。

## 5. 运行项目

通过以下命令启动 Fastify 项目：

```bash
npm run dev
```

访问 `http://localhost:3000`，你应该会看到返回的 JSON 响应：

```json
{
  "hello": "world"
}
```

## 6. 编译 TypeScript 项目

在开发完成后，你可以使用 `npm run build` 编译 TypeScript 文件：

```bash
npm run build
```

这会将 `src` 目录中的 `.ts` 文件编译到 `dist` 目录中。然后，你可以使用 `npm run start` 来启动编译后的 JavaScript 项目。

## 7. 使用类型定义和装饰器

为了提升开发体验，你可以使用 Fastify 的类型定义来增强 TypeScript 项目的类型检查。例如，定义路由处理函数时，你可以使用 TypeScript 类型来确保请求和响应对象的类型安全：

```typescript
import fastify, { FastifyRequest, FastifyReply } from 'fastify';

const app = fastify();

interface MySchema {
  name: string;
}

app.post('/greet', async (request: FastifyRequest<{ Body: MySchema }>, reply: FastifyReply) => {
  const { name } = request.body;
  return { greeting: `Hello, ${name}` };
});

app.listen(3000, (err, address) => {
  if (err) {
    app.log.error(err);
    process.exit(1);
  }
  app.log.info(`Server listening at ${address}`);
});
```

在上面的代码中，`FastifyRequest<{ Body: MySchema }>` 用于定义请求体的数据类型 `MySchema`，确保传入的数据符合预期。

## 总结

通过上述步骤，你可以轻松创建一个支持 TypeScript 的 Fastify 项目。借助 TypeScript 的静态类型检查和 Fastify 高性能的框架，你可以在开发过程中获得更好的开发体验和更高的执行效率。
