快速开始
在本页中,我们将学习如何使用tspec从TypeScript类型生成OpenAPI Specification,并通过Swagger UI提供服务。
安装
假设您已安装Node.js和TypeScript,创建一个新的TypeScript项目:
bash
mkdir my-project
cd my-project然后初始化tsconfig.json:
bash
tsc --init现在初始化package.json并安装tspec:
bash
yarn init -y
yarn add tspecbash
npm init -y
npm install tspecbash
pnpm init -y
pnpm add tspec定义ApiSpec
Tspec支持根据您的框架以多种方式定义API规范。
ts
import { Tspec } from "tspec";
/** 通过JSDoc定义的模式描述 */
interface Book {
/** 通过JSDoc定义的字段描述 */
id: number;
title: string;
description?: string;
}
export type BookApiSpec = Tspec.DefineApiSpec<{
paths: {
'/books/{id}': {
get: {
summary: '通过ID获取书籍',
path: { id: number },
responses: { 200: Book },
},
},
}
}>;ts
import { Request, Response } from 'express';
import { Tspec } from 'tspec';
interface Book {
id: number;
title: string;
}
// 使用类型化参数定义Express处理程序
export const getBook = async (
req: Request<{ id: string }>,
res: Response<Book>,
) => {
res.json({ id: Number(req.params.id), title: 'Book Title' });
};
// 使用handler类型自动生成参数和响应
export type BookApiSpec = Tspec.DefineApiSpec<{
paths: {
'/books/{id}': {
get: {
summary: '通过ID获取书籍',
handler: typeof getBook,
},
},
},
}>;ts
import { Controller, Get, Param } from '@nestjs/common';
interface Book {
id: number;
title: string;
}
/**
* Books API控制器
*/
@Controller('books')
export class BooksController {
/**
* 通过ID获取单本书籍
* @summary 通过ID获取书籍
*/
@Get(':id')
findOne(@Param('id') id: string): Promise<Book> {
return Promise.resolve({ id: Number(id), title: 'Book Title' });
}
}
// 无需手动定义ApiSpec!
// 使用`tspec generate --nestjs`生成OpenAPI规范生成OpenAPI规范
现在生成OpenAPI规范:
bash
npx tspec generate --outputPath openapi.jsonbash
npx tspec generate --nestjs --outputPath openapi.jsonTIP
生成的OpenAPI规范
(为了可读性,生成的OpenAPI规范以yaml格式显示)
yaml
openapi: 3.0.3
info:
title: Tspec API
version: 0.0.1
paths:
/books/{id}:
get:
operationId: BookApiSpec_get_/books/{id}
tags:
- Book
summary: 通过ID获取书籍
parameters:
- name: id
in: path
required: true
schema:
type: number
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/Book'
components:
schemas:
Book:
description: 通过JSDoc定义的模式描述
type: object
properties:
id:
description: 通过JSDoc定义的字段描述
type: number
title:
type: string
description:
type: string
required:
- id
- title提供OpenAPI规范
使用Swagger UI提供OpenAPI规范:
bash
yarn tspec server --port 3000bash
npx tspec server --port 3000bash
pnpm tspec server --port 3000然后在浏览器中打开http://localhost:3000/docs。
您将看到Swagger UI页面:

您可以在Schemas标签中查看模式定义。
