输入快取
此软件包添加了强大的 TypeScript 支持以快速化请求处理器并强制操作 处理器将输入用于验证请求参数和答复的系统。 从这个计划,它有两个 东西:
- 根据类型Script Schema进行静态类型检查
request.bodyrequest.headersrequest.querystringrequest.paramsroute.path.params并被推断和绘制成request.params,也不可能在 schema params 中做一个类型reply总是基于状态,开发者将无法使用平原reply.send()不过 被迫首先明确设定状态,据此推断反应类型
- 从 TS Schema 生成 JSON 计划( 使用 类型标注-json-schema 带有自定义
全部变换
@tjs注释可用于微调输出)- 自从我们使用
typejescript-json-schema:所有已知的解放限制都继承:- 记录没有正确转换, 使用
{ [k: string]: string }改为或提示@tjs
- 记录没有正确转换, 使用
- 自从我们使用
- 运行时使用生成的 JSON schema 验证(可选但强烈推荐,因为它为运行时带来额外的安全性,并确保关于数据的代码假设正确)
使用量
npm i @coobaha/typed-fastify
pnpm i @coobaha/typed-fastify
yarn add @coobaha/typed-fastify
我们想要建立服务的例子
GET / => Hello ($querystring.name || world)
简单执行而不产生计划将遵循
import addSchema, { Schema } from '@coobaha/typed-fastify';
import fastify from 'fastify';
export interface ExampleSchema extends Schema {
paths: {
'GET /': {
request: {
querystring: {
name?: string;
};
};
response: {
200: {
content: string;
};
};
};
};
}
const exampleService: Service<ExampleSchema> = {
'GET /': (req, reply) => {
// typescript will infer correct types for us
const name = req.query.name ?? 'World';
// Calling send directly is not allowed
// reply.send(`Hello ${name}`)
// Calling send with wrong payload will result in an error
// reply.status(200).send(new Date())
return reply.status(200).send(`Hello ${name}`);
},
};
const app = fastify();
addSchema(app, {
// it is strongly recommended to generate json schema to guaruntee runtime validity
jsonSchema: {},
service: exampleService,
});
// Start listening.
app.listen(3000, (err: any) => {
if (err) {
app.log.error(err);
process.exit(1);
}
});
复杂的例子可以找到 排字测试 财务报告和审定财务报表 内 综合. test.ts。 。 。 .
JSON 计划生成
您可以通过使用 : typed-fastify-schema 或者说 tfs 弹匣
npx tfs gen
tfs gen [files]
Generates json schemas next to corresponding ts files
Positionals:
files glob pattern of files [string] [required]
Options:
--help Show help [boolean]
--version Show version number [boolean]
# it will generate example_schema.gen.json next to file
npx tfs gen example_schema.ts
生成 schema 时 - 直接传递到插件中以获得运行时间验证 QQ
import jsonSchema from './example_schema.gen.json';
// ...
addSchema(app, {
jsonSchema,
service,
});
写作服务
-
一个对象中的处理器 推论会很好用,你只是让TS开心 事情正在起作用
-
处理器在不同的文件或单独的函数中 - 您需要用精确的处理器类型提示 TS .
import { RequestHandler, Schema } from '@coobaha/typed-fastify';
interface MySchema extends Schema {}
const myHandler: RequestHandler<MySchema, 'GET /hello'>['AsRoute'] = (req, reply) => {};
- 当您想要为多个交叉端点设置复杂的共享处理器( 共享相同) 道具)
import { RequestHandler, Schema } from '@coobaha/typed-fastify';
interface MySchema extends Schema {}
const myHandlers: RequestHandler<MySchema, 'GET /hello' | `GET /hello2`>['AsRoute'] = (req, reply) => {};
- 有时属性会不一样(例如从没有身体和POST会). 在此情况下, 您可能会被要求添加函数参数的类型
import { RequestHandler, Schema } from '@coobaha/typed-fastify';
interface MySchema extends Schema {}
type MyHandlers = RequestHandler<MySchema, 'GET /hello' | `POST /hello`>;
const myHandlers = (req: MyHandlers['Request'], reply: MyHandlers['Reply']): MyHandlers['Return'] => {};
// if handler is async/await
const myHandlersAsync = async (req: MyHandlers['Request'], reply: MyHandlers['Reply']): MyHandlers['ReturnAsync'] => {};
addSchema(app, {
jsonSchema: {},
service: {
'GET /hello': myHandlers,
'GET /hello2': myHandlers,
},
});
可能是TS无法推断 确切类型的复杂处理器 addSchema 所以你会
需要手动操作
addSchema(app, {
jsonSchema: {},
service: {
'GET /hello': myHandlers,
'GET /hello2': myHandlers as RequestHandler<ExtendedSchema, 'GET /hello2'>['AsRoute'],
},
});
注释类型
此库正在使用 类型标注-json-schema 带有自定义
变相为生相. 全体 @tjs 说明 可用于微调计划输出
-
@type可用于在使用后指定结束类型toJSON, toString类似对象的方法ObjectID从蒙戈DB -
自从我们使用
typejescript-json-schema:所有已知的限制也都继承: - 记录没有正确转换,使用{ [k: string]: string }改为或提示@tjs -
额外收益 设定为
false默认- 使用情况
{ [k: string]: T }用于明确定义类型additionalProperties - 或添加
/** @additionalProperties true */允许任何东西的说明 - 详情见:
- 使用情况