Skip to content

no-construct-in-public-property-of-construct

recommended を使用した場合、このルールが有効になります。

このルールは、CDK Construct の public プロパティに指定する型として、書き込み可能な CDK Construct 型 (例: Bucket) の代わりに読み取り専用リソースのための interface (例: IBucket) を指定することを強制します。

AWS リソースを表す Construct (例: Bucket) が、読み取り専用リソースのための interface (例: IBucket) を implements している場合、Construct の public プロパティには、読み取り専用リソースのための interface (例: IBucket) を指定することが推奨されます。
これにより、意図しないリソースの変更を防ぐことができます。


🔧 使用方法

js
// eslint.config.mjs
export default defineConfig([
  {
    // ... some configs
    rules: {
      "awscdk/no-construct-in-public-property-of-construct": "error",
    },
  },
]);

✅ 適切な例

ts
import { Construct } from "constructs";
import { IBucket } from "aws-cdk-lib/aws-s3";
import { DockerImageAsset } from "aws-cdk-lib/aws-ecr-assets";
import { MetricFilter } from "aws-cdk-lib/aws-logs";

class MyConstruct extends Construct {
  // ✅ 読み取り専用リソースのための interface (`IBucket` など) を指定している
  public readonly bucket: IBucket;

  // ✅ AWS リソースを表す Construct でない Construct (`DockerImageAsset` など) を指定している
  public readonly asset: DockerImageAsset;

  // ✅ 読み取り専用リソースのための interface が存在しない場合、
  //    AWS リソースを表す Construct 型 (`MetricFilter` など) は指定可能
  public readonly metricFilter: MetricFilter;
}

❌ 不適切な例

ts
import { Construct } from "constructs";
import { Bucket } from "aws-cdk-lib/aws-s3";

class MyConstruct extends Construct {
  // ❌ 読み取り専用リソースのための interface が存在する場合、 AWS リソースを表す Construct は指定不可
  //    (Bucket は `IBucket` を implements しているため、`IBucket` を指定すべき)
  public readonly bucket: Bucket;
}