Serverless TypeScript模板使用serverless-openapi-documentation遇类型错误求解
Fix: 'documentation' Field Not Recognized in Serverless.ts Http Events with OpenAPI Plugin
我刚遇到过完全一样的问题!这不是插件不支持TypeScript,而是Serverless官方的TypeScript类型定义没有包含serverless-openapi-documentation插件扩展的documentation字段——毕竟官方类型只覆盖核心框架配置,第三方插件的扩展需要我们手动补充类型定义。下面是两种解决方法:
方法一:扩展Serverless的Http类型(推荐,保持类型安全)
我们可以通过TypeScript的模块扩展功能,给Http接口添加documentation字段的类型定义:
- 在项目根目录创建
types/serverless.d.ts文件(如果types文件夹不存在就新建一个) - 写入以下代码:
import { Http as OriginalHttp } from 'serverless/aws'; declare module 'serverless/aws' { // 扩展Http接口,添加openapi插件需要的documentation字段 interface Http { documentation?: { summary?: string; description?: string; parameters?: Array<{ name: string; in: 'query' | 'path' | 'header'; required?: boolean; type?: string; description?: string; }>; requestModels?: { [contentType: string]: string; }; // 可以根据插件的需求添加更多字段,参考官方文档的配置项 }; } }
- 确保你的
tsconfig.json包含这个类型文件,在include数组里加上:
{ "include": [ "./src/**/*.ts", "./types/**/*.d.ts" // 新增这一行 ] }
这样TypeScript编译器就会认可http事件里的documentation字段了,还能享受到类型提示的好处。
方法二:临时用类型断言绕过检查(不推荐,适合快速测试)
如果只是想快速验证插件功能,不想折腾类型定义,可以用as any绕过TypeScript的类型检查:
functions: { hello: { handler: 'handler.hello', events: [ { http: { method: 'get', path: 'hello', documentation: { summary: "Create something" }, } as any, // 这里加上类型断言 } ] } }
不过这种方法会失去TypeScript的类型校验优势,长期项目还是推荐第一种方法。
为什么YML版本没问题?
因为YAML是动态配置文件,没有编译时的类型检查,插件可以直接读取到扩展的documentation字段;而TypeScript是静态类型语言,编译器只会认可官方定义的字段,所以必须手动扩展类型才能让这些插件字段合法。
内容的提问来源于stack exchange,提问作者pafede2
相关产品推荐
相关产品推荐

