From b6d84ad7efd47d4efe64b7078064f7c1ce874ec5 Mon Sep 17 00:00:00 2001 From: Leon Michalski Date: Tue, 2 Dec 2025 15:58:33 +0000 Subject: [PATCH] fix(typewriter): struct cannot extend strucs --- .../typewriter/src/renderer/typescript.ts | 6 ++++ packages/@cdklabs/typewriter/src/struct.ts | 4 +++ .../typewriter/test/interface.test.ts | 36 ++++++++++++++++++- 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/packages/@cdklabs/typewriter/src/renderer/typescript.ts b/packages/@cdklabs/typewriter/src/renderer/typescript.ts index fa0e8d936..a8207a7cb 100644 --- a/packages/@cdklabs/typewriter/src/renderer/typescript.ts +++ b/packages/@cdklabs/typewriter/src/renderer/typescript.ts @@ -128,6 +128,12 @@ export class TypeScriptRenderer extends Renderer { this.renderDocs(structType, { forceStruct: true }); this.emit(`${modifiers}interface ${structType.name}`); this.renderTypeParameters(structType.typeParameters); + + if (structType.extends.length > 0) { + this.emit(' extends '); + this.emitList(structType.extends, ', ', (t) => this.renderType(t)); + } + this.emitBlock(' ', () => { const props = Array.from(structType.properties.values()).filter((p) => p.visibility === MemberVisibility.Public); diff --git a/packages/@cdklabs/typewriter/src/struct.ts b/packages/@cdklabs/typewriter/src/struct.ts index a48f4d3b3..0fe5c1870 100644 --- a/packages/@cdklabs/typewriter/src/struct.ts +++ b/packages/@cdklabs/typewriter/src/struct.ts @@ -36,6 +36,10 @@ export class StructType extends MemberType { spec.properties?.forEach((p) => this.addProperty(p)); } + public get extends() { + return this.spec.extends ?? []; + } + /** * Adds a property to the interface * diff --git a/packages/@cdklabs/typewriter/test/interface.test.ts b/packages/@cdklabs/typewriter/test/interface.test.ts index a327f6bac..0a3775f7c 100644 --- a/packages/@cdklabs/typewriter/test/interface.test.ts +++ b/packages/@cdklabs/typewriter/test/interface.test.ts @@ -1,4 +1,4 @@ -import { InterfaceType, Module, TypeScriptRenderer } from '../src'; +import { InterfaceType, Module, StructType, TypeScriptRenderer } from '../src'; const renderer = new TypeScriptRenderer(); let scope: Module; @@ -24,3 +24,37 @@ test('can update some interface spec fields after initial creation', () => { }" `); }); + +test('struct can extend struct', () => { + new StructType(scope, { + name: 'MyStruct', + extends: [scope.type('AnotherStruct')], + }); + + expect(renderer.render(scope)).toMatchInlineSnapshot(` + "/* eslint-disable prettier/prettier, @stylistic/max-len */ + /** + * @struct + */ + interface MyStruct extends AnotherStruct { + + }" + `); +}); + +test('struct can extend multiple structs', () => { + new StructType(scope, { + name: 'MyStruct', + extends: [scope.type('AnotherStruct'), scope.type('SecondStruct')], + }); + + expect(renderer.render(scope)).toMatchInlineSnapshot(` + "/* eslint-disable prettier/prettier, @stylistic/max-len */ + /** + * @struct + */ + interface MyStruct extends AnotherStruct, SecondStruct { + + }" + `); +});