Sword.js的类型系统可以帮助我们使用ts来规定api的输入和输出,这很酷,减少了很多了原先写在业务逻辑的代码,比如:
if(typeof code !== "string") return "code不为string"
但是在真实的业务逻辑中,我们会使用各种第三方库来校验数据,但是远远不如ts灵活,这是事实。我们沿用了TSRPC的核心类型系统库,而且会随时和最新的类型库保持同步,在这一篇中,我们主要描述几个类型使用场景(proto.ts),比如我们构造了一个params类型:
export interface ReqParams {
id: number,
nickname: string,
}
然后客户端传递了一个这样的对象:
{
"id": 1,
"nickname": "hello",
"role": "admin"
}
客户端在试图改变role的值,不管这个api是否支持role的修改,这个请求就是非法的,所以sword.js会提示客户端,这样的请求是错误的:
{
"statusCode": 400,
"statusMessage": "Excess property `role` should not exists.",
"stack": []
}
当然,如果你需要一些自定义类型,你可以这样做
export interface ReqParams {
id: number,
nickname: string,
[key: string]: string
}
高级类型
你可以把ts的部分类型特性用在proto中,比如
- 逻辑判断,&, |
- 工具类型,Pick、Omit、Overwrite、Partial…
- 组合类型
- 基础类型,数组
- 引用类型
- Date,ArrayBuffer,Uint8Array
你甚至可以进行嵌套:
type X1 = {
value?: Array<
{ common: string } & (
{
type: 'A',
a: string
} | {
type: 'B',
b: string
}
)
> | null;
};
sword.js默认使用json进行传输,这也是目前大多主流应用所青睐的,但是二进制传输更小更快,后续团队会考虑多serverless平台,如果没什么大坑,很快就会支持这个功能,并且配套一个前端sdk包。