diff --git a/internal/transformers/declarations/transform.go b/internal/transformers/declarations/transform.go index 24e18fccd54..3ae4002e774 100644 --- a/internal/transformers/declarations/transform.go +++ b/internal/transformers/declarations/transform.go @@ -1430,7 +1430,7 @@ func (tx *DeclarationTransformer) transformClassDeclaration(input *ast.ClassDecl parameterProperties = append(parameterProperties, updated) } else { // Pattern - this is currently an error, but we emit declarations for it somewhat correctly - // !!! is this worth reimplementing? We never made it not-an-error + parameterProperties = append(parameterProperties, tx.walkBindingPattern(param.Name().AsBindingPattern(), param)...) } } tx.state.getSymbolAccessibilityDiagnostic = oldDiag @@ -1542,6 +1542,27 @@ func (tx *DeclarationTransformer) transformClassDeclaration(input *ast.ClassDecl ) } +func (tx *DeclarationTransformer) walkBindingPattern(pattern *ast.BindingPattern, param *ast.Node) []*ast.Node { + var elems []*ast.Node + for _, elem := range pattern.Elements.Nodes { + if ast.IsOmittedExpression(elem) { + continue + } + if ast.IsBindingPattern(elem.Name()) { + elems = append(elems, tx.walkBindingPattern(elem.Name().AsBindingPattern(), param)...) + continue + } + elems = append(elems, tx.Factory().NewPropertyDeclaration( + tx.ensureModifiers(param), + elem.Name(), + nil, /*questionOrExclamationToken*/ + tx.ensureType(elem, false), + nil, /*initializer*/ + )) + } + return elems +} + func (tx *DeclarationTransformer) transformVariableStatement(input *ast.VariableStatement) *ast.Node { visible := false for _, decl := range input.DeclarationList.AsVariableDeclarationList().Declarations.Nodes { diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuringParameterProperties.js b/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuringParameterProperties.js index 425cdbb68d0..8dbb677bbff 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuringParameterProperties.js +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuringParameterProperties.js @@ -36,10 +36,16 @@ class C3 { //// [declarationEmitDestructuringParameterProperties.d.ts] declare class C1 { + x: string; + y: string; + z: string; constructor([x, y, z]: string[]); } type TupleType1 = [string, number, boolean]; declare class C2 { + x: string; + y: number; + z: boolean; constructor([x, y, z]: TupleType1); } type ObjType1 = { @@ -48,5 +54,8 @@ type ObjType1 = { z: boolean; }; declare class C3 { + x: number; + y: string; + z: boolean; constructor({ x, y, z }: ObjType1); } diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuringParameterProperties.js.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuringParameterProperties.js.diff deleted file mode 100644 index cf20bd06eaa..00000000000 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuringParameterProperties.js.diff +++ /dev/null @@ -1,28 +0,0 @@ ---- old.declarationEmitDestructuringParameterProperties.js -+++ new.declarationEmitDestructuringParameterProperties.js -@@= skipped -35, +35 lines =@@ - - //// [declarationEmitDestructuringParameterProperties.d.ts] - declare class C1 { -- x: string; -- y: string; -- z: string; - constructor([x, y, z]: string[]); - } - type TupleType1 = [string, number, boolean]; - declare class C2 { -- x: string; -- y: number; -- z: boolean; - constructor([x, y, z]: TupleType1); - } - type ObjType1 = { -@@= skipped -18, +12 lines =@@ - z: boolean; - }; - declare class C3 { -- x: number; -- y: string; -- z: boolean; - constructor({ x, y, z }: ObjType1); - } \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuringParameterProperties2.js b/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuringParameterProperties2.js index 487b2e131c4..1f50c2fcd1b 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuringParameterProperties2.js +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuringParameterProperties2.js @@ -36,10 +36,16 @@ class C3 { //// [declarationEmitDestructuringParameterProperties2.d.ts] declare class C1 { + x: string; + y: string; + z: string; constructor([x, y, z]: string[]); } type TupleType1 = [string, number, boolean]; declare class C2 { + x: string; + y: number; + z: boolean; constructor([x, y, z]: TupleType1); } type ObjType1 = { @@ -48,5 +54,8 @@ type ObjType1 = { z: boolean; }; declare class C3 { + x: number; + y: string; + z: boolean; constructor({ x, y, z }: ObjType1); } diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuringParameterProperties2.js.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuringParameterProperties2.js.diff deleted file mode 100644 index f0f4c441a4a..00000000000 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuringParameterProperties2.js.diff +++ /dev/null @@ -1,28 +0,0 @@ ---- old.declarationEmitDestructuringParameterProperties2.js -+++ new.declarationEmitDestructuringParameterProperties2.js -@@= skipped -35, +35 lines =@@ - - //// [declarationEmitDestructuringParameterProperties2.d.ts] - declare class C1 { -- x: string; -- y: string; -- z: string; - constructor([x, y, z]: string[]); - } - type TupleType1 = [string, number, boolean]; - declare class C2 { -- x: string; -- y: number; -- z: boolean; - constructor([x, y, z]: TupleType1); - } - type ObjType1 = { -@@= skipped -18, +12 lines =@@ - z: boolean; - }; - declare class C3 { -- x: number; -- y: string; -- z: boolean; - constructor({ x, y, z }: ObjType1); - } \ No newline at end of file