diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 1c3bc622b0c..9001f12ce7a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5931,7 +5931,7 @@ namespace ts { return factory.createPropertySignature( /*modifiers*/ undefined, name, - t.typeExpression && isJSDocOptionalType(t.typeExpression.type) ? factory.createToken(SyntaxKind.QuestionToken) : undefined, + t.isBracketed || t.typeExpression && isJSDocOptionalType(t.typeExpression.type) ? factory.createToken(SyntaxKind.QuestionToken) : undefined, overrideTypeNode || (t.typeExpression && visitNode(t.typeExpression.type, visitExistingNodeTreeSymbols)) || factory.createKeywordTypeNode(SyntaxKind.AnyKeyword) ); })); diff --git a/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps1.js b/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps1.js new file mode 100644 index 00000000000..962299ec19c --- /dev/null +++ b/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps1.js @@ -0,0 +1,48 @@ +//// [foo.js] +/** + * foo + * + * @public + * @param {object} opts + * @param {number} opts.a + * @param {number} [opts.b] + * @param {number} [opts.c] + * @returns {number} + */ +function foo({ a, b, c }) { + return a + b + c; +} + + +//// [foo.js] +/** + * foo + * + * @public + * @param {object} opts + * @param {number} opts.a + * @param {number} [opts.b] + * @param {number} [opts.c] + * @returns {number} + */ +function foo({ a, b, c }) { + return a + b + c; +} + + +//// [foo.d.ts] +/** + * foo + * + * @public + * @param {object} opts + * @param {number} opts.a + * @param {number} [opts.b] + * @param {number} [opts.c] + * @returns {number} + */ +declare function foo({ a, b, c }: { + a: number; + b?: number; + c?: number; +}): number; diff --git a/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps1.symbols b/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps1.symbols new file mode 100644 index 00000000000..9d008cb186a --- /dev/null +++ b/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps1.symbols @@ -0,0 +1,23 @@ +=== tests/cases/conformance/jsdoc/declarations/foo.js === +/** + * foo + * + * @public + * @param {object} opts + * @param {number} opts.a + * @param {number} [opts.b] + * @param {number} [opts.c] + * @returns {number} + */ +function foo({ a, b, c }) { +>foo : Symbol(foo, Decl(foo.js, 0, 0)) +>a : Symbol(a, Decl(foo.js, 10, 14)) +>b : Symbol(b, Decl(foo.js, 10, 17)) +>c : Symbol(c, Decl(foo.js, 10, 20)) + + return a + b + c; +>a : Symbol(a, Decl(foo.js, 10, 14)) +>b : Symbol(b, Decl(foo.js, 10, 17)) +>c : Symbol(c, Decl(foo.js, 10, 20)) +} + diff --git a/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps1.types b/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps1.types new file mode 100644 index 00000000000..f692812bd5a --- /dev/null +++ b/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps1.types @@ -0,0 +1,25 @@ +=== tests/cases/conformance/jsdoc/declarations/foo.js === +/** + * foo + * + * @public + * @param {object} opts + * @param {number} opts.a + * @param {number} [opts.b] + * @param {number} [opts.c] + * @returns {number} + */ +function foo({ a, b, c }) { +>foo : ({ a, b, c }: { a: number; b?: number; c?: number;}) => number +>a : number +>b : number +>c : number + + return a + b + c; +>a + b + c : number +>a + b : number +>a : number +>b : number +>c : number +} + diff --git a/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps2.js b/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps2.js new file mode 100644 index 00000000000..8157df664ab --- /dev/null +++ b/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps2.js @@ -0,0 +1,49 @@ +//// [foo.js] +/** + * foo + * + * @public + * @param {object} opts + * @param {number} opts.a + * @param {number} [opts.b] + * @param {number} [opts.c] + * @returns {number} + */ +function foo({ a, b, c }) { + return a + (b ?? 0) + (c ?? 0); +} + + +//// [foo.js] +"use strict"; +/** + * foo + * + * @public + * @param {object} opts + * @param {number} opts.a + * @param {number} [opts.b] + * @param {number} [opts.c] + * @returns {number} + */ +function foo({ a, b, c }) { + return a + (b ?? 0) + (c ?? 0); +} + + +//// [foo.d.ts] +/** + * foo + * + * @public + * @param {object} opts + * @param {number} opts.a + * @param {number} [opts.b] + * @param {number} [opts.c] + * @returns {number} + */ +declare function foo({ a, b, c }: { + a: number; + b?: number | undefined; + c?: number | undefined; +}): number; diff --git a/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps2.symbols b/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps2.symbols new file mode 100644 index 00000000000..9d6df290f62 --- /dev/null +++ b/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps2.symbols @@ -0,0 +1,23 @@ +=== tests/cases/conformance/jsdoc/declarations/foo.js === +/** + * foo + * + * @public + * @param {object} opts + * @param {number} opts.a + * @param {number} [opts.b] + * @param {number} [opts.c] + * @returns {number} + */ +function foo({ a, b, c }) { +>foo : Symbol(foo, Decl(foo.js, 0, 0)) +>a : Symbol(a, Decl(foo.js, 10, 14)) +>b : Symbol(b, Decl(foo.js, 10, 17)) +>c : Symbol(c, Decl(foo.js, 10, 20)) + + return a + (b ?? 0) + (c ?? 0); +>a : Symbol(a, Decl(foo.js, 10, 14)) +>b : Symbol(b, Decl(foo.js, 10, 17)) +>c : Symbol(c, Decl(foo.js, 10, 20)) +} + diff --git a/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps2.types b/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps2.types new file mode 100644 index 00000000000..b976d6fae6e --- /dev/null +++ b/tests/baselines/reference/jsDeclarationsOptionalTypeLiteralProps2.types @@ -0,0 +1,31 @@ +=== tests/cases/conformance/jsdoc/declarations/foo.js === +/** + * foo + * + * @public + * @param {object} opts + * @param {number} opts.a + * @param {number} [opts.b] + * @param {number} [opts.c] + * @returns {number} + */ +function foo({ a, b, c }) { +>foo : ({ a, b, c }: { a: number; b?: number | undefined; c?: number | undefined;}) => number +>a : number +>b : number | undefined +>c : number | undefined + + return a + (b ?? 0) + (c ?? 0); +>a + (b ?? 0) + (c ?? 0) : number +>a + (b ?? 0) : number +>a : number +>(b ?? 0) : number +>b ?? 0 : number +>b : number | undefined +>0 : 0 +>(c ?? 0) : number +>c ?? 0 : number +>c : number | undefined +>0 : 0 +} + diff --git a/tests/baselines/reference/jsdocParamTagTypeLiteral.types b/tests/baselines/reference/jsdocParamTagTypeLiteral.types index ef926eec222..d38f3fd20cc 100644 --- a/tests/baselines/reference/jsdocParamTagTypeLiteral.types +++ b/tests/baselines/reference/jsdocParamTagTypeLiteral.types @@ -23,7 +23,7 @@ normal(12); * @param {string} [opts1.w="hi"] doc5 */ function foo1(opts1) { ->foo1 : (opts1: { x: string; y?: string | undefined; z: string | undefined; w: string | undefined;}) => void +>foo1 : (opts1: { x: string; y?: string | undefined; z?: string | undefined; w?: string | undefined;}) => void >opts1 : { x: string; y?: string | undefined; z?: string | undefined; w?: string | undefined; } opts1.x; @@ -92,7 +92,7 @@ foo3({x: 'abc'}); * @param {string} [opts4[].w="hi"] */ function foo4(opts4) { ->foo4 : (opts4: { x: string; y?: string | undefined; z: string; w: string;}) => void +>foo4 : (opts4: { x: string; y?: string | undefined; z?: string; w?: string;}) => void >opts4 : { x: string; y?: string | undefined; z?: string | undefined; w?: string | undefined; }[] opts4[0].x; diff --git a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsOptionalTypeLiteralProps1.ts b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsOptionalTypeLiteralProps1.ts new file mode 100644 index 00000000000..d0797b47c4e --- /dev/null +++ b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsOptionalTypeLiteralProps1.ts @@ -0,0 +1,19 @@ +// @allowJs: true +// @checkJs: true +// @target: esnext +// @outDir: ./out +// @declaration: true +// @filename: foo.js +/** + * foo + * + * @public + * @param {object} opts + * @param {number} opts.a + * @param {number} [opts.b] + * @param {number} [opts.c] + * @returns {number} + */ +function foo({ a, b, c }) { + return a + b + c; +} diff --git a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsOptionalTypeLiteralProps2.ts b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsOptionalTypeLiteralProps2.ts new file mode 100644 index 00000000000..860622295c6 --- /dev/null +++ b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsOptionalTypeLiteralProps2.ts @@ -0,0 +1,20 @@ +// @allowJs: true +// @checkJs: true +// @strict: true +// @target: esnext +// @outDir: ./out +// @declaration: true +// @filename: foo.js +/** + * foo + * + * @public + * @param {object} opts + * @param {number} opts.a + * @param {number} [opts.b] + * @param {number} [opts.c] + * @returns {number} + */ +function foo({ a, b, c }) { + return a + (b ?? 0) + (c ?? 0); +}