Amazon CDK:构造类型不正确,即使它是从 cdk.Construct 扩展的?

Aek*_*xit 3 node.js aws-cloudformation typescript aws-cdk

我正在尝试使用自定义域部署 API 网关。(没有函数,只是其他堆栈可以导入和使用的通用 API 网关)

bin/api-app.ts

import { APIAppStack } from '../lib/api-app-stack';

export class MyAPIAppStack extends cdk.Stack {
    constructor(parent: cdk.App, name: string, props: cdk.StackProps) {
        super(parent, name, props);

        new APIAppStack(this, 'APIApp', {
            domainName: this.node.tryGetContext('domain'),
            siteSubDomain: this.node.tryGetContext('subdomain'),
        });
   }
}

const app = new cdk.App();

new MyAPIAppStack(app, 'APIAppStack'+(((process.env.subdomain || "").length > 0)?"-"+process.env.subdomain:""), { env: {
    region: process.env.AWS_DEFAULT_REGION,
    account: process.env.CDK_DEFAULT_ACCOUNT
}});

app.synth();
Run Code Online (Sandbox Code Playgroud)

这是我的构造 lib/api-app-stack::

export interface APIAppProps {
    domainName: string;
    siteSubDomain: string;
}

export class APIAppStack extends Construct {
    constructor(parent: Construct, name: string, props: APIAppProps) {
        super(parent, name);
        const zone = route53.HostedZone.fromLookup(this, 'Zone', { domainName: props.domainName });
        const siteDomain = "api." + props.domainName;
        new cdk.CfnOutput(this, 'API', { value: 'https://' + siteDomain });

        // ... removed code for brevity. All works fine.
        // My error is below: (I am not able to create the ApiGateway itself)
        const api = new apigw.RestApi(this, 'APIApp', {
            restApiName: 'API App',
            description: "The API App exposes a common endpoint for the Apps to consume.",
            deployOptions: {
                accessLogDestination: accessLogDestination,
                accessLogFormat: apigw.AccessLogFormat.jsonWithStandardFields(),
                loggingLevel: apigw.MethodLoggingLevel.INFO,
                dataTraceEnabled: true,
                tracingEnabled: true,
                metricsEnabled: true,
                description: "Prod Stage"
            }
        });
Run Code Online (Sandbox Code Playgroud)

错误位于apigw.RestApi(this

Argument of type 'this' is not assignable to parameter of type 'Construct'.
  Type 'APIAppStack' is not assignable to type 'Construct'.
    Property 'onValidate' is protected but type 'Construct' is not a class derived from 'Construct'.ts(2345)
Run Code Online (Sandbox Code Playgroud)

我是 TypeScript 新手,我知道可能存在属性不匹配的情况,但我从GitHubStaticSite上的示例代码中派生了此代码。我什至看到源自. 我错过了什么吗?ApiAppStackConstruct

编辑1:这是我的package.json

{
  "name": "api-app",
  "version": "0.1.0",
  "bin": {
    "frontend-app": "bin/api-app.js"
  },
  "scripts": {
    "build": "tsc",
    "watch": "tsc -w",
    "cdk": "cdk"
  },
  "devDependencies": {
    "aws-cdk": "1.38.0",
    "@aws-cdk/assert": "1.38.0",
    "@types/node": "10.17.5",
    "jest": "^25.5.0",
    "ts-node": "^8.1.0",
    "typescript": "~3.7.2",
    "@aws-cdk/aws-certificatemanager": "*",
    "@aws-cdk/aws-cloudfront": "*",
    "@aws-cdk/aws-iam": "*",
    "@aws-cdk/aws-route53": "*",
    "@aws-cdk/aws-route53-targets": "*",
    "@aws-cdk/aws-s3": "*",
    "@aws-cdk/aws-s3-deployment": "*",
    "@aws-cdk/core": "*"
  },
  "dependencies": {
    "@aws-cdk/aws-apigateway": "^1.47.1",
    "@aws-cdk/aws-sns": "1.38.0",
    "@aws-cdk/aws-sns-subscriptions": "1.38.0",
    "@aws-cdk/aws-sqs": "1.38.0",
    "@aws-cdk/core": "1.38.0"
  }
}

Run Code Online (Sandbox Code Playgroud)

Ped*_*iro 5

CDK 在小版本升级中不具有向后兼容性。

这意味着您的cdk.Constructfrom 包

"@aws-cdk/core": "1.38.0"
Run Code Online (Sandbox Code Playgroud)

apigw.RestApi与使用至少 1.47 版本的不兼容:

"@aws-cdk/aws-apigateway": "^1.47.1"
Run Code Online (Sandbox Code Playgroud)

要解决此问题,请将所有 @aws-cdk 包更改为您的相同版本package.json,并且不要忘记删除^或至少替换为~.

然后只需重新安装您的依赖项:npm install