在Serverless.ts中用Ref关联Lambda Layer与函数时遇TypeScript错误
解决Serverless TypeScript中Lambda Layer关联的类型错误
错误原因
你遇到的TypeScript错误源于Serverless Framework的类型定义约束:函数的layers字段要求传入ARN字符串数组,但你传入了一个包含Ref的单个对象,不符合AwsArn[]的类型要求。
解决方案
方法1:用Serverless内置变量直接引用层
当你在配置中定义了prisma层后,可通过Serverless变量语法直接引用其ARN,无需手动写Ref,这是最简洁且符合类型要求的方式:
functions: { main: { handler: "handler.MainHandler", timeout: 300, // 以数组形式传入层的ARN引用 layers: ["${self:layers.prisma.arn}"], }, }, layers: { prisma: { path: ".prisma-layer", description: "Layer for prisma clients", package: { patterns: [ "!nodejs/node_modules/@prisma/engines/*", "!nodejs/node_modules/.prisma/**/libquery_engine-*", "nodejs/node_modules/.prisma/**/libquery_engine-rhel-openssl-1.0.x.so.node", "!nodejs/prisma/**", "nodejs/prisma/*.db", ], }, }, },
方法2:显式使用CloudFormation Ref并适配类型
如果需要手动用CloudFormation的Ref,需将其作为数组元素传入,并通过类型断言绕过TypeScript的类型检查:
import type { AWS } from '@serverless/typescript'; const serverlessConfiguration: AWS = { // 其他配置项... functions: { main: { handler: "handler.MainHandler", timeout: 300, layers: [{ Ref: "PrismaLambdaLayer" }] as unknown as string[], }, }, layers: { prisma: { path: ".prisma-layer", description: "Layer for prisma clients", package: { patterns: [ "!nodejs/node_modules/@prisma/engines/*", "!nodejs/node_modules/.prisma/**/libquery_engine-*", "nodejs/node_modules/.prisma/**/libquery_engine-rhel-openssl-1.0.x.so.node", "!nodejs/prisma/**", "nodejs/prisma/*.db", ], }, }, }, }; export default serverlessConfiguration;
补充说明
Serverless Framework会自动为你定义的prisma层生成对应的CloudFormation资源名称(即PrismaLambdaLayer),因此方法1的变量引用是官方推荐的写法,无需手动维护资源名称。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

