Skip to content

Commit c219fda

Browse files
authored
fix(37703): forbid required parameter after optional (#38155)
1 parent d86bdf4 commit c219fda

File tree

7 files changed

+91
-3
lines changed

7 files changed

+91
-3
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37048,10 +37048,9 @@ namespace ts {
3704837048
return grammarErrorOnNode(parameter.name, Diagnostics.A_rest_parameter_cannot_have_an_initializer);
3704937049
}
3705037050
}
37051-
else if (parameter.questionToken) {
37051+
else if (isOptionalParameter(parameter)) {
3705237052
seenOptionalParameter = true;
37053-
37054-
if (parameter.initializer) {
37053+
if (parameter.questionToken && parameter.initializer) {
3705537054
return grammarErrorOnNode(parameter.name, Diagnostics.Parameter_cannot_have_question_mark_and_initializer);
3705637055
}
3705737056
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
tests/cases/conformance/jsdoc/0.js(7,20): error TS1016: A required parameter cannot follow an optional parameter.
2+
3+
4+
==== tests/cases/conformance/jsdoc/0.js (1 errors) ====
5+
// @ts-check
6+
/**
7+
* @param {number} a
8+
* @param {number} [b]
9+
* @param {number} c
10+
*/
11+
function foo(a, b, c) {}
12+
~
13+
!!! error TS1016: A required parameter cannot follow an optional parameter.
14+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//// [0.js]
2+
// @ts-check
3+
/**
4+
* @param {number} a
5+
* @param {number} [b]
6+
* @param {number} c
7+
*/
8+
function foo(a, b, c) {}
9+
10+
11+
//// [0.js]
12+
// @ts-check
13+
/**
14+
* @param {number} a
15+
* @param {number} [b]
16+
* @param {number} c
17+
*/
18+
function foo(a, b, c) { }
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
=== tests/cases/conformance/jsdoc/0.js ===
2+
// @ts-check
3+
/**
4+
* @param {number} a
5+
* @param {number} [b]
6+
* @param {number} c
7+
*/
8+
function foo(a, b, c) {}
9+
>foo : Symbol(foo, Decl(0.js, 0, 0))
10+
>a : Symbol(a, Decl(0.js, 6, 13))
11+
>b : Symbol(b, Decl(0.js, 6, 15))
12+
>c : Symbol(c, Decl(0.js, 6, 18))
13+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
=== tests/cases/conformance/jsdoc/0.js ===
2+
// @ts-check
3+
/**
4+
* @param {number} a
5+
* @param {number} [b]
6+
* @param {number} c
7+
*/
8+
function foo(a, b, c) {}
9+
>foo : (a: number, b?: number, c: number) => void
10+
>a : number
11+
>b : number
12+
>c : number
13+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
tests/cases/conformance/jsdoc/a.js(5,18): error TS1016: A required parameter cannot follow an optional parameter.
2+
3+
4+
==== tests/cases/conformance/jsdoc/a.js (1 errors) ====
5+
/**
6+
* @param {string=} `args`
7+
* @param `bwarg` {?number?}
8+
*/
9+
function f(args, bwarg) {
10+
~~~~~
11+
!!! error TS1016: A required parameter cannot follow an optional parameter.
12+
}
13+
14+
==== tests/cases/conformance/jsdoc/ts.ts (0 errors) ====
15+
/**
16+
* @param `arg` - this is fine
17+
*/
18+
function g(arg: string) {
19+
}
20+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// @allowJS: true
2+
// @suppressOutputPathCheck: true
3+
4+
// @filename: 0.js
5+
// @ts-check
6+
/**
7+
* @param {number} a
8+
* @param {number} [b]
9+
* @param {number} c
10+
*/
11+
function foo(a, b, c) {}

0 commit comments

Comments
 (0)