From 60ce788302f75a136ce327f8b7f2499ea5dd96f0 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Mon, 30 Oct 2023 21:24:14 +0200 Subject: [PATCH] fix(53933): Confusing rules around function parameter names in a type (#53946) --- src/compiler/checker.ts | 2 +- .../defaultValueInFunctionTypes.errors.txt | 14 ++++++++++---- .../reference/defaultValueInFunctionTypes.js | 5 ++++- .../reference/defaultValueInFunctionTypes.symbols | 13 +++++++++---- .../reference/defaultValueInFunctionTypes.types | 6 ++++++ .../cases/compiler/defaultValueInFunctionTypes.ts | 4 +++- 6 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 254dbf57532..3ac1038a4cd 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -42152,7 +42152,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { forEach(node.name.elements, checkSourceElement); } // For a parameter declaration with an initializer, error and exit if the containing function doesn't have a body - if (isParameter(node) && node.initializer && nodeIsMissing((getContainingFunction(node) as FunctionLikeDeclaration).body)) { + if (node.initializer && isParameterDeclaration(node) && nodeIsMissing((getContainingFunction(node) as FunctionLikeDeclaration).body)) { error(node, Diagnostics.A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation); return; } diff --git a/tests/baselines/reference/defaultValueInFunctionTypes.errors.txt b/tests/baselines/reference/defaultValueInFunctionTypes.errors.txt index 13ae5683e3b..9014a4ccb59 100644 --- a/tests/baselines/reference/defaultValueInFunctionTypes.errors.txt +++ b/tests/baselines/reference/defaultValueInFunctionTypes.errors.txt @@ -1,11 +1,17 @@ -defaultValueInFunctionTypes.ts(1,9): error TS2371: A parameter initializer is only allowed in a function or constructor implementation. -defaultValueInFunctionTypes.ts(2,11): error TS2371: A parameter initializer is only allowed in a function or constructor implementation. +defaultValueInFunctionTypes.ts(1,15): error TS2371: A parameter initializer is only allowed in a function or constructor implementation. +defaultValueInFunctionTypes.ts(3,9): error TS2371: A parameter initializer is only allowed in a function or constructor implementation. +defaultValueInFunctionTypes.ts(4,11): error TS2371: A parameter initializer is only allowed in a function or constructor implementation. -==== defaultValueInFunctionTypes.ts (2 errors) ==== +==== defaultValueInFunctionTypes.ts (3 errors) ==== + type Foo = ({ first = 0 }: { first?: number }) => unknown; + ~~~~~ +!!! error TS2371: A parameter initializer is only allowed in a function or constructor implementation. + var x: (a: number = 1) => number; ~~~~~~~~~~~~~ !!! error TS2371: A parameter initializer is only allowed in a function or constructor implementation. var y = <(a : string = "") => any>(undefined) ~~~~~~~~~~~~~~~ -!!! error TS2371: A parameter initializer is only allowed in a function or constructor implementation. \ No newline at end of file +!!! error TS2371: A parameter initializer is only allowed in a function or constructor implementation. + \ No newline at end of file diff --git a/tests/baselines/reference/defaultValueInFunctionTypes.js b/tests/baselines/reference/defaultValueInFunctionTypes.js index ce9884dc648..c5a76f4133b 100644 --- a/tests/baselines/reference/defaultValueInFunctionTypes.js +++ b/tests/baselines/reference/defaultValueInFunctionTypes.js @@ -1,8 +1,11 @@ //// [tests/cases/compiler/defaultValueInFunctionTypes.ts] //// //// [defaultValueInFunctionTypes.ts] +type Foo = ({ first = 0 }: { first?: number }) => unknown; + var x: (a: number = 1) => number; -var y = <(a : string = "") => any>(undefined) +var y = <(a : string = "") => any>(undefined) + //// [defaultValueInFunctionTypes.js] var x; diff --git a/tests/baselines/reference/defaultValueInFunctionTypes.symbols b/tests/baselines/reference/defaultValueInFunctionTypes.symbols index ec06d6278cf..47dc7825f37 100644 --- a/tests/baselines/reference/defaultValueInFunctionTypes.symbols +++ b/tests/baselines/reference/defaultValueInFunctionTypes.symbols @@ -1,12 +1,17 @@ //// [tests/cases/compiler/defaultValueInFunctionTypes.ts] //// === defaultValueInFunctionTypes.ts === +type Foo = ({ first = 0 }: { first?: number }) => unknown; +>Foo : Symbol(Foo, Decl(defaultValueInFunctionTypes.ts, 0, 0)) +>first : Symbol(first, Decl(defaultValueInFunctionTypes.ts, 0, 13)) +>first : Symbol(first, Decl(defaultValueInFunctionTypes.ts, 0, 28)) + var x: (a: number = 1) => number; ->x : Symbol(x, Decl(defaultValueInFunctionTypes.ts, 0, 3)) ->a : Symbol(a, Decl(defaultValueInFunctionTypes.ts, 0, 8)) +>x : Symbol(x, Decl(defaultValueInFunctionTypes.ts, 2, 3)) +>a : Symbol(a, Decl(defaultValueInFunctionTypes.ts, 2, 8)) var y = <(a : string = "") => any>(undefined) ->y : Symbol(y, Decl(defaultValueInFunctionTypes.ts, 1, 3)) ->a : Symbol(a, Decl(defaultValueInFunctionTypes.ts, 1, 10)) +>y : Symbol(y, Decl(defaultValueInFunctionTypes.ts, 3, 3)) +>a : Symbol(a, Decl(defaultValueInFunctionTypes.ts, 3, 10)) >undefined : Symbol(undefined) diff --git a/tests/baselines/reference/defaultValueInFunctionTypes.types b/tests/baselines/reference/defaultValueInFunctionTypes.types index 96f3ecac93a..38e4e17edac 100644 --- a/tests/baselines/reference/defaultValueInFunctionTypes.types +++ b/tests/baselines/reference/defaultValueInFunctionTypes.types @@ -1,6 +1,12 @@ //// [tests/cases/compiler/defaultValueInFunctionTypes.ts] //// === defaultValueInFunctionTypes.ts === +type Foo = ({ first = 0 }: { first?: number }) => unknown; +>Foo : ({ first }: { first?: number; }) => unknown +>first : number +>0 : 0 +>first : number + var x: (a: number = 1) => number; >x : (a?: number) => number >a : number diff --git a/tests/cases/compiler/defaultValueInFunctionTypes.ts b/tests/cases/compiler/defaultValueInFunctionTypes.ts index fd9229a2104..cae244be77d 100644 --- a/tests/cases/compiler/defaultValueInFunctionTypes.ts +++ b/tests/cases/compiler/defaultValueInFunctionTypes.ts @@ -1,2 +1,4 @@ +type Foo = ({ first = 0 }: { first?: number }) => unknown; + var x: (a: number = 1) => number; -var y = <(a : string = "") => any>(undefined) \ No newline at end of file +var y = <(a : string = "") => any>(undefined)