“App”类型的参数不可分配给“Construct”类型的参数

问题描述 投票:0回答:3

我正在尝试简单的 CDK 教程,但是我遇到了一些错误。

我的代码就是这样,

    Argument of type 'App' is not assignable to parameter of type 'Construct'.
    Type 'App' is missing the following properties from type 'Construct': onValidate, onPrepare, onSynthesize, validate, and 2 more.

    7 new HelloCdkStack(app, 'HelloCdkStack', {

不知何故,这个错误出现了,但在一些使用

cdk.App()
的教程中。为什么会出现这个错误??

    import * as cdk from "@aws-cdk/core";
    import {Table, AttributeType} from "@aws-cdk/aws-dynamodb";
    
    export class HelloCdkStack extends cdk.Stack {
      constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);
    
        new Table(this, "items", {
          partitionKey: {
            name: "itemId",
            type: AttributeType.STRING,
          },
          tableName: "items",
          removalPolicy: cdk.RemovalPolicy.DESTROY, // NOT recommended for production code
        });
        // The code that defines your stack goes here
    
        // example resource
        // const queue = new sqs.Queue(this, 'HelloCdkQueue', {
        //   visibilityTimeout: cdk.Duration.seconds(300)
        // });
      }
    }
    const app = new cdk.App();
    new HelloCdkStack(app, "HelloCdkStack");
    app.synth();
amazon-web-services aws-lambda aws-cdk
3个回答
19
投票

在 AWS CDK 1.x 中,导入是使用 import were made from '@aws-cdk/core' 完成的。这在 CDK 2.x 中发生了变化,其中导入是从 aws-cdk-lib 包进行的。

许多教程仍然使用 CDK 1.x,而 CDK 的起始代码使用 2.x。这就是为什么您会出现差异,因为应用程序初始化的代码会说使用较新的模块,而教程会假设您会以旧的方式执行此操作。

要解决这个问题,

  1. 更新您的堆栈文件以使用新的:
    import { Stack, StackProps } from 'aws-cdk-lib';

  1. 更新您的应用程序初始化文件以使用旧的:
    import * as cdk from '@aws-cdk/core';

AWS CDK 2.x 文档:https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html

AWS CDK 1.x 文档:https://docs.aws.amazon.com/cdk/api/v1/docs/aws-construct-library.html


6
投票

转到

cdk_primer-stack.ts
文件并将核心 SDK 的导入从
import * as cdk from 'aws-cdk-lib';
修复为
import * as cdk from '@aws-cdk/core';
问题是您在文件中使用的 CDK Core 版本与在
cdk_primer-stack.ts
中导入的版本不同。


0
投票

AWS 文档建议现在将 aws-cdk 从 CDK 1.x 升级到 CDK 2.x,可以像这样导入:

import {} from "aws-cdk-lib";

现在来到错误部分,我们不必单独导入“@aws-cdk/aws-dynamodb”或“@aws-cdk/aws-ecs”。在V2中会出现上述错误。相反,将其更改为:

import {  Stack,  StackProps,  aws_dynamodb as dynamodb,   aws_ecs as ecs } from 'aws-cdk-lib';

这称为经典导入。请参阅此处:https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html#classic-import

然后在如下代码中使用它:

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

    const table = new dynamodb.Table(this, 'table_name', {
      partitionKey: {name: 'id', type: dynamodb.AttributeType.STRING}
    });

   ....rest of the code
 }
}

这会很有魅力。

© www.soinside.com 2019 - 2024. All rights reserved.