从EventBridgeEvent获取S3数据编译报错:TypeScript类型定义问题
问题分析与解决方案
错误原因
你自定义的S3EventDetail类型结构完全错误:EventBridgeEvent<'Object Created', S3EventDetail>中,第二个泛型参数就是EventBridge事件里detail字段的类型,但你把整个EventBridge事件的完整结构(包括外层的version、id、detail-type等字段)都塞进了S3EventDetail,还额外嵌套了一层detail属性。这就导致event.detail的类型被识别为你定义的S3EventDetail,而这个类型里的bucket和object是在它自身的detail子属性下,直接写event.detail.bucket自然会触发编译错误。
运行时正常是因为实际触发的EventBridge事件结构中,event.detail确实直接包含bucket和object,但TypeScript的类型检查是编译时校验,和实际运行数据无关。
修正方案
方案1:修正自定义类型定义
只保留EventBridge事件中detail字段的内容作为S3EventDetail的直接属性:
interface S3EventDetail { version: string; bucket: { name: string; }; object: { key: string; size: number; etag: string; 'version-id': string; sequencer: string; }; 'request-id': string; requester: string; 'source-ip-address': string; reason: string; } export const handler: Handler<EventBridgeEvent<'Object Created', S3EventDetail>> = async (event) => { // 现在编译不会报错 const { bucket, object } = event.detail; console.log('Bucket Name:', bucket.name); console.log('Object Key:', object.key); // 后续逻辑 };
方案2:拆分类型更清晰
把整个EventBridge事件的类型和内部detail的类型分开定义,可读性更好:
import { EventBridgeEvent, Handler } from 'aws-lambda'; // 仅定义EventBridge事件中detail字段的结构 interface S3ObjectCreatedDetail { version: string; bucket: { name: string; }; object: { key: string; size: number; etag: string; 'version-id': string; sequencer: string; }; 'request-id': string; requester: string; 'source-ip-address': string; reason: string; } // 处理器类型明确指向完整的EventBridge事件,detail部分使用上面的自定义类型 export const handler: Handler<EventBridgeEvent<'Object Created', S3ObjectCreatedDetail>> = async (event) => { const { bucket, object } = event.detail; // 业务逻辑 };
内容的提问来源于stack exchange,提问作者Sara N
相关产品推荐
相关产品推荐

