Skip to content

Commit d74a038

Browse files
author
Leon Michalski
committed
fix(typewriter): struct cannot extend strucs
1 parent 7f7bad2 commit d74a038

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

packages/@cdklabs/typewriter/src/renderer/typescript.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ export class TypeScriptRenderer extends Renderer {
128128
this.renderDocs(structType, { forceStruct: true });
129129
this.emit(`${modifiers}interface ${structType.name}`);
130130
this.renderTypeParameters(structType.typeParameters);
131+
132+
if (structType.extends.length > 0) {
133+
this.emit(' extends ');
134+
this.emitList(structType.extends, ', ', (t) => this.renderType(t));
135+
}
136+
131137
this.emitBlock(' ', () => {
132138
const props = Array.from(structType.properties.values()).filter((p) => p.visibility === MemberVisibility.Public);
133139

packages/@cdklabs/typewriter/src/struct.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ export class StructType extends MemberType {
3636
spec.properties?.forEach((p) => this.addProperty(p));
3737
}
3838

39+
public get extends() {
40+
return this.spec.extends ?? [];
41+
}
42+
3943
/**
4044
* Adds a property to the interface
4145
*

packages/@cdklabs/typewriter/test/interface.test.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { InterfaceType, Module, TypeScriptRenderer } from '../src';
1+
import { InterfaceType, Module, StructType, TypeScriptRenderer } from '../src';
22

33
const renderer = new TypeScriptRenderer();
44
let scope: Module;
@@ -24,3 +24,20 @@ test('can update some interface spec fields after initial creation', () => {
2424
}"
2525
`);
2626
});
27+
28+
test('struct can extend struct', () => {
29+
new StructType(scope, {
30+
name: 'MyStruct',
31+
extends: [scope.type('AnotherStruct')]
32+
});
33+
34+
expect(renderer.render(scope)).toMatchInlineSnapshot(`
35+
"/* eslint-disable prettier/prettier, @stylistic/max-len */
36+
/**
37+
* @struct
38+
*/
39+
interface MyStruct extends AnotherStruct {
40+
41+
}"
42+
`);
43+
});

0 commit comments

Comments
 (0)