Skip to content

Commit 303ed3a

Browse files
authored
fix(42099): fix JSDoc optional properties declaration emit (#42116)
1 parent ea03c29 commit 303ed3a

10 files changed

+241
-3
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5931,7 +5931,7 @@ namespace ts {
59315931
return factory.createPropertySignature(
59325932
/*modifiers*/ undefined,
59335933
name,
5934-
t.typeExpression && isJSDocOptionalType(t.typeExpression.type) ? factory.createToken(SyntaxKind.QuestionToken) : undefined,
5934+
t.isBracketed || t.typeExpression && isJSDocOptionalType(t.typeExpression.type) ? factory.createToken(SyntaxKind.QuestionToken) : undefined,
59355935
overrideTypeNode || (t.typeExpression && visitNode(t.typeExpression.type, visitExistingNodeTreeSymbols)) || factory.createKeywordTypeNode(SyntaxKind.AnyKeyword)
59365936
);
59375937
}));
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//// [foo.js]
2+
/**
3+
* foo
4+
*
5+
* @public
6+
* @param {object} opts
7+
* @param {number} opts.a
8+
* @param {number} [opts.b]
9+
* @param {number} [opts.c]
10+
* @returns {number}
11+
*/
12+
function foo({ a, b, c }) {
13+
return a + b + c;
14+
}
15+
16+
17+
//// [foo.js]
18+
/**
19+
* foo
20+
*
21+
* @public
22+
* @param {object} opts
23+
* @param {number} opts.a
24+
* @param {number} [opts.b]
25+
* @param {number} [opts.c]
26+
* @returns {number}
27+
*/
28+
function foo({ a, b, c }) {
29+
return a + b + c;
30+
}
31+
32+
33+
//// [foo.d.ts]
34+
/**
35+
* foo
36+
*
37+
* @public
38+
* @param {object} opts
39+
* @param {number} opts.a
40+
* @param {number} [opts.b]
41+
* @param {number} [opts.c]
42+
* @returns {number}
43+
*/
44+
declare function foo({ a, b, c }: {
45+
a: number;
46+
b?: number;
47+
c?: number;
48+
}): number;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
=== tests/cases/conformance/jsdoc/declarations/foo.js ===
2+
/**
3+
* foo
4+
*
5+
* @public
6+
* @param {object} opts
7+
* @param {number} opts.a
8+
* @param {number} [opts.b]
9+
* @param {number} [opts.c]
10+
* @returns {number}
11+
*/
12+
function foo({ a, b, c }) {
13+
>foo : Symbol(foo, Decl(foo.js, 0, 0))
14+
>a : Symbol(a, Decl(foo.js, 10, 14))
15+
>b : Symbol(b, Decl(foo.js, 10, 17))
16+
>c : Symbol(c, Decl(foo.js, 10, 20))
17+
18+
return a + b + c;
19+
>a : Symbol(a, Decl(foo.js, 10, 14))
20+
>b : Symbol(b, Decl(foo.js, 10, 17))
21+
>c : Symbol(c, Decl(foo.js, 10, 20))
22+
}
23+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
=== tests/cases/conformance/jsdoc/declarations/foo.js ===
2+
/**
3+
* foo
4+
*
5+
* @public
6+
* @param {object} opts
7+
* @param {number} opts.a
8+
* @param {number} [opts.b]
9+
* @param {number} [opts.c]
10+
* @returns {number}
11+
*/
12+
function foo({ a, b, c }) {
13+
>foo : ({ a, b, c }: { a: number; b?: number; c?: number;}) => number
14+
>a : number
15+
>b : number
16+
>c : number
17+
18+
return a + b + c;
19+
>a + b + c : number
20+
>a + b : number
21+
>a : number
22+
>b : number
23+
>c : number
24+
}
25+
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
//// [foo.js]
2+
/**
3+
* foo
4+
*
5+
* @public
6+
* @param {object} opts
7+
* @param {number} opts.a
8+
* @param {number} [opts.b]
9+
* @param {number} [opts.c]
10+
* @returns {number}
11+
*/
12+
function foo({ a, b, c }) {
13+
return a + (b ?? 0) + (c ?? 0);
14+
}
15+
16+
17+
//// [foo.js]
18+
"use strict";
19+
/**
20+
* foo
21+
*
22+
* @public
23+
* @param {object} opts
24+
* @param {number} opts.a
25+
* @param {number} [opts.b]
26+
* @param {number} [opts.c]
27+
* @returns {number}
28+
*/
29+
function foo({ a, b, c }) {
30+
return a + (b ?? 0) + (c ?? 0);
31+
}
32+
33+
34+
//// [foo.d.ts]
35+
/**
36+
* foo
37+
*
38+
* @public
39+
* @param {object} opts
40+
* @param {number} opts.a
41+
* @param {number} [opts.b]
42+
* @param {number} [opts.c]
43+
* @returns {number}
44+
*/
45+
declare function foo({ a, b, c }: {
46+
a: number;
47+
b?: number | undefined;
48+
c?: number | undefined;
49+
}): number;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
=== tests/cases/conformance/jsdoc/declarations/foo.js ===
2+
/**
3+
* foo
4+
*
5+
* @public
6+
* @param {object} opts
7+
* @param {number} opts.a
8+
* @param {number} [opts.b]
9+
* @param {number} [opts.c]
10+
* @returns {number}
11+
*/
12+
function foo({ a, b, c }) {
13+
>foo : Symbol(foo, Decl(foo.js, 0, 0))
14+
>a : Symbol(a, Decl(foo.js, 10, 14))
15+
>b : Symbol(b, Decl(foo.js, 10, 17))
16+
>c : Symbol(c, Decl(foo.js, 10, 20))
17+
18+
return a + (b ?? 0) + (c ?? 0);
19+
>a : Symbol(a, Decl(foo.js, 10, 14))
20+
>b : Symbol(b, Decl(foo.js, 10, 17))
21+
>c : Symbol(c, Decl(foo.js, 10, 20))
22+
}
23+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
=== tests/cases/conformance/jsdoc/declarations/foo.js ===
2+
/**
3+
* foo
4+
*
5+
* @public
6+
* @param {object} opts
7+
* @param {number} opts.a
8+
* @param {number} [opts.b]
9+
* @param {number} [opts.c]
10+
* @returns {number}
11+
*/
12+
function foo({ a, b, c }) {
13+
>foo : ({ a, b, c }: { a: number; b?: number | undefined; c?: number | undefined;}) => number
14+
>a : number
15+
>b : number | undefined
16+
>c : number | undefined
17+
18+
return a + (b ?? 0) + (c ?? 0);
19+
>a + (b ?? 0) + (c ?? 0) : number
20+
>a + (b ?? 0) : number
21+
>a : number
22+
>(b ?? 0) : number
23+
>b ?? 0 : number
24+
>b : number | undefined
25+
>0 : 0
26+
>(c ?? 0) : number
27+
>c ?? 0 : number
28+
>c : number | undefined
29+
>0 : 0
30+
}
31+

tests/baselines/reference/jsdocParamTagTypeLiteral.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ normal(12);
2323
* @param {string} [opts1.w="hi"] doc5
2424
*/
2525
function foo1(opts1) {
26-
>foo1 : (opts1: { x: string; y?: string | undefined; z: string | undefined; w: string | undefined;}) => void
26+
>foo1 : (opts1: { x: string; y?: string | undefined; z?: string | undefined; w?: string | undefined;}) => void
2727
>opts1 : { x: string; y?: string | undefined; z?: string | undefined; w?: string | undefined; }
2828

2929
opts1.x;
@@ -92,7 +92,7 @@ foo3({x: 'abc'});
9292
* @param {string} [opts4[].w="hi"]
9393
*/
9494
function foo4(opts4) {
95-
>foo4 : (opts4: { x: string; y?: string | undefined; z: string; w: string;}) => void
95+
>foo4 : (opts4: { x: string; y?: string | undefined; z?: string; w?: string;}) => void
9696
>opts4 : { x: string; y?: string | undefined; z?: string | undefined; w?: string | undefined; }[]
9797

9898
opts4[0].x;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// @allowJs: true
2+
// @checkJs: true
3+
// @target: esnext
4+
// @outDir: ./out
5+
// @declaration: true
6+
// @filename: foo.js
7+
/**
8+
* foo
9+
*
10+
* @public
11+
* @param {object} opts
12+
* @param {number} opts.a
13+
* @param {number} [opts.b]
14+
* @param {number} [opts.c]
15+
* @returns {number}
16+
*/
17+
function foo({ a, b, c }) {
18+
return a + b + c;
19+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// @allowJs: true
2+
// @checkJs: true
3+
// @strict: true
4+
// @target: esnext
5+
// @outDir: ./out
6+
// @declaration: true
7+
// @filename: foo.js
8+
/**
9+
* foo
10+
*
11+
* @public
12+
* @param {object} opts
13+
* @param {number} opts.a
14+
* @param {number} [opts.b]
15+
* @param {number} [opts.c]
16+
* @returns {number}
17+
*/
18+
function foo({ a, b, c }) {
19+
return a + (b ?? 0) + (c ?? 0);
20+
}

0 commit comments

Comments
 (0)