如何在 serverless.ts 文件中设置 function.events.sns.arn?

How to set function.events.sns.arn in a serverless.ts file?

我正在使用 aws-nodejs-typescript 模板设置一个新的无服务器 TypeScript monorepo。该模板生成一个 serverless.ts 配置文件。

支持为现有 SNS 主题添加 AWS SNS 事件侦听器:

https://www.serverless.com/framework/docs/providers/aws/events/sns/

但是,sns 事件的类型定义中没有相应的属性:

TS2322: Type ‘{ arn: string; }’ is not assignable to type ‘Sns’. Object literal may only specify known properties, and ‘arn’ does not exist in type ‘Sns’.

awsProvider.d.ts(487, 9): The expected type comes from property ‘sns’ which is declared here on type ‘Event’

如何使用 serverless.ts 为现有 SNS 主题配置事件?

答案是..类型强制!不得不向下转换为未知,然后向上转换为 Sns 事件类型。这是我的设置中的最小 serverless.ts

import type { Serverless, ApiGateway, Sns } from 'serverless/aws';

const serverlessConfiguration: Serverless = {
  service: {
    name: 'foo',
  },
  frameworkVersion: '2',
  custom: {
    webpack: {
      webpackConfig: './webpack.config.js',
      packager: 'yarn',
      includeModules: true,
    },
  },
  package: {
    individually: true,
  },
  plugins: ['serverless-webpack', 'serverless-jest-plugin'],
  provider: {
    name: 'aws',
    runtime: 'nodejs12.x',
    region: 'us-west-2',
    stage: "${opt:stage, 'dev'}",
    apiGateway: {
      minimumCompressionSize: 1024,
      shouldStartNameWithService: true,
    } as ApiGateway,
    environment: {
      AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
    },
  },
  functions: {
    bar: {
      handler: 'src/baz.handler',
      timeout: 900,
      reservedConcurrency: 1,
      events: [
        {
          sns: ({
            arn:
              '${cf:another-stack.TopicArn}',
          } as unknown) as Sns,
        },
      ],
    },
  },
};

module.exports = serverlessConfiguration;