diff --git a/packages/compiler/src/core/checker.ts b/packages/compiler/src/core/checker.ts index 8d2203984d9..eadd4c977bb 100644 --- a/packages/compiler/src/core/checker.ts +++ b/packages/compiler/src/core/checker.ts @@ -5254,6 +5254,16 @@ export function createChecker(program: Program, resolver: NameResolver): Checker parentModel, ); + if (isArrayModelType(parentModel) && (newProperties.length > 0 || additionalIndexer !== undefined)) { + reportCheckerDiagnostic( + createDiagnostic({ + code: "no-array-properties", + target: prop.target, + }), + ); + continue; + } + if (additionalIndexer) { if (spreadIndexers) { spreadIndexers.push(additionalIndexer); diff --git a/packages/compiler/test/checker/model.test.ts b/packages/compiler/test/checker/model.test.ts index 5555a516397..2ba67205e5f 100644 --- a/packages/compiler/test/checker/model.test.ts +++ b/packages/compiler/test/checker/model.test.ts @@ -704,6 +704,34 @@ describe("with is", () => { }); }); + it("model is array cannot spread record properties", async () => { + const diagnostics = await Tester.diagnose(` + model A is Array { + ...Record; + } + `); + expectDiagnostics(diagnostics, { + code: "no-array-properties", + message: "Array models cannot have any properties.", + }); + }); + + it("model extends array cannot spread model properties", async () => { + const diagnostics = await Tester.diagnose(` + model Source { + name: string; + } + + model A extends Array { + ...Source; + } + `); + expectDiagnostics(diagnostics, { + code: "no-array-properties", + message: "Array models cannot have any properties.", + }); + }); + it("doesn't allow duplicate properties", async () => { const diagnostics = await Tester.diagnose(` model A { x: int32 }