如何正确解读TypeScript中的箭头函数类型定义
ValidatedEventAPIGatewayProxyEvent类型解读 类型核心作用
这个类型同时约束Lambda处理函数的入参格式和返回值格式,不是只约束单一方面,本质是基于AWS官方Lambda类型封装的、带请求体自动类型推导的函数类型。
逐层拆解类型定义
你项目里api-gateway.ts已经写全了这个类型的完整声明,顺着定义拆解就能完全看懂逻辑:
- 基础依赖的
Handler<TEvent, TResult>类型来自@types/aws-lambda,是AWS官方定义的Lambda通用处理函数类型,规则非常明确:- 第一个泛型参数
TEvent定义函数接收到的入参事件类型 - 第二个泛型参数
TResult定义函数的返回值类型(异步函数对应Promise<TResult>)
- 第一个泛型参数
- 中间类型
ValidatedAPIGatewayProxyEvent<S>是对原生API网关事件的改造:
这行做了两件事:type ValidatedAPIGatewayProxyEvent<S> = Omit<APIGatewayProxyEvent, 'body'> & { body: FromSchema<S> }- 用
Omit工具类型删掉原生APIGatewayProxyEvent里默认类型为string | null的模糊body字段 - 用交叉类型拼接上经过
FromSchema<S>推导的类型化body字段——FromSchema来自json-schema-to-ts,会根据你传入的JSON Schema自动生成对应的TS类型,在你当前的代码里,传入的schema要求body有必填的name字符串字段,推导后event.body的类型就是{name: string}
- 用
- 最终导出的
ValidatedEventAPIGatewayProxyEvent<S>就是封装完成的函数类型:
把前面的事件类型传入export type ValidatedEventAPIGatewayProxyEvent<S> = Handler<ValidatedAPIGatewayProxyEvent<S>, APIGatewayProxyResult>Handler的第一个泛型位,第二个泛型位固定为API网关要求的标准返回结构APIGatewayProxyResult(要求包含statusCode、body等必填字段)。
你当前代码的类型校验逻辑
给hello函数标注这个类型后,TS会自动做两层校验,不需要你手动给event或者返回值加类型标注:
- 入参侧:
event会自动被推导为改造后的API网关事件类型,写代码时event.body.name会有正确的类型提示,如果你访问不存在的字段、或者传参不符合schema要求,TS会直接抛出错误 - 返回值侧:函数返回的内容必须符合
APIGatewayProxyResult结构,你现在调用的formatJSONResponse刚好返回符合要求的结构,所以可以正常通过校验。
这类泛型类型标注的通用解读方法
- 不要靠类型名字猜含义,顺着import路径找类型的原始声明文件,绝大多数项目内的自定义类型只有几行到十几行代码,直接读定义比搜外部文档效率高得多
- 函数类型上的泛型参数,基本都是用来填充入参、返回值里的动态可变部分,这里的泛型
<typeof schema>就是把你写的请求校验schema传进去,自动推导请求体类型,避免重复维护JSON Schema和TS接口两份定义。
相关学习参考
- TypeScript官方手册的泛型、工具类型、交叉类型、函数类型章节,掌握这几块内容就能看懂绝大多数业务项目里的自定义TS类型
json-schema-to-ts的包文档,了解Schema和TS类型联动的方案,这是Serverless项目里做请求校验+类型推导的常用实践@types/aws-lambda的类型声明文件,里面包含所有AWS服务触发Lambda时的事件结构、返回值结构定义,是写Serverless TS应用的核心参考。
内容的提问来源于stack exchange,提问作者Heisenberg
相关产品推荐
相关产品推荐

