typescript 类型为“undefined”的参数不能赋给类型为“Construct”的参数

t98cgbkg  于 2023-01-31  发布在  TypeScript
关注(0)|答案(2)|浏览(357)

我尝试了AWS CDK文档中的示例代码,但它没有按预期工作。
CDK版本2.62.2在Typescript.Everywhere(这是站在那里是一个声明错误。The argument of type "undefined" cannot be assigned to the parameter of type "Construct".
代码:

import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

declare const vpc: ec2.Vpc;

// Create an ECS cluster
const cluster = new ecs.Cluster(this, 'Cluster', { vpc });

// Add capacity to it
cluster.addCapacity('DefaultAutoScalingGroupCapacity', {
  instanceType: new ec2.InstanceType("t2.xlarge"),
  desiredCapacity: 3,
});

const taskDefinition = new ecs.Ec2TaskDefinition(this, 'TaskDef');

taskDefinition.addContainer('DefaultContainer', {
  image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample"),
  memoryLimitMiB: 512,
});

// Instantiate an Amazon ECS Service
const ecsService = new ecs.Ec2Service(this, 'Service', {
  cluster,
  taskDefinition,
});
wz3gfoph

wz3gfoph1#

TL;DR错误提示this关键字未定义。请将示例化代码移到构造子类构造函数中。
构造的第一个参数是它的作用域或父构造。您使用this关键字作为作用域是正确的,但当前编写的代码是undefined。定义构造的idomatic CDK方法在构造子类的构造函数内部,通常是Stack。在Stack的构造函数内部,this将引用Stack示例。
vpc变量在你的代码中也是undefined。按照惯例,CDK文档使用Typescript变量声明语句来缩短示例。严格地说,这不会导致错误,但可能不是你所期望的行为。如果你不想使用默认的Vpc,当vpc属性是undefined时,将为你创建Vpc。你需要示例化一个Vpc,而不仅仅是声明vpc变量。

class MyStack extends Stack {
  constructor(scope: App, id: string, props?: StackProps) {
    super(scope, id, props);

    const vpc = new ec2.Vpc(this, 'Vpc', { maxAzs: 2 });

    const cluster = new ecs.Cluster(this, 'Cluster', { vpc });
  }
}

aws-samples/aws-cdk-examples repo有几个完整的EC2工作ECS示例。

zvokhttg

zvokhttg2#

在你试图创建一个新的ecs.cluster的地方,你传递了一个"未定义"的VPC,因为你只声明了常量而没有设置任何值。
要创建一个新的VPC,您应该修改行:

declare const vpc: ec2.Vpc;

变成这样:

const vpc = new ec2.Vpc(this, 'TheVPC')

有关此问题的文档可在https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html中找到

相关问题