diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index f24f8b93d1..c788c6807a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5567,6 +5567,9 @@ namespace ts { if (isJSDocNonNullableType(node)) { return visitNode(node.type, visitExistingNodeTreeSymbols); } + if (isJSDocVariadicType(node)) { + return createArrayTypeNode(visitNode((node as JSDocVariadicType).type, visitExistingNodeTreeSymbols)); + } if (isTypeReferenceNode(node) && isIdentifier(node.typeName) && node.typeName.escapedText === "") { return setOriginalNode(createKeywordTypeNode(SyntaxKind.AnyKeyword), node); } @@ -5593,8 +5596,8 @@ namespace ts { mapDefined(node.parameters, (p, i) => p.name && isIdentifier(p.name) && p.name.escapedText === "new" ? (newTypeNode = p.type, undefined) : createParameter( /*decorators*/ undefined, /*modifiers*/ undefined, - p.dotDotDotToken, - p.name || p.dotDotDotToken ? `args` : `arg${i}`, + getEffectiveDotDotDotForParameter(p), + p.name || getEffectiveDotDotDotForParameter(p) ? `args` : `arg${i}`, p.questionToken, visitNode(p.type, visitExistingNodeTreeSymbols), /*initializer*/ undefined @@ -5608,8 +5611,8 @@ namespace ts { map(node.parameters, (p, i) => createParameter( /*decorators*/ undefined, /*modifiers*/ undefined, - p.dotDotDotToken, - p.name || p.dotDotDotToken ? `args` : `arg${i}`, + getEffectiveDotDotDotForParameter(p), + p.name || getEffectiveDotDotDotForParameter(p) ? `args` : `arg${i}`, p.questionToken, visitNode(p.type, visitExistingNodeTreeSymbols), /*initializer*/ undefined @@ -5653,6 +5656,10 @@ namespace ts { return visitEachChild(node, visitExistingNodeTreeSymbols, nullTransformationContext); + function getEffectiveDotDotDotForParameter(p: ParameterDeclaration) { + return p.dotDotDotToken || (p.type && isJSDocVariadicType(p.type) ? createToken(SyntaxKind.DotDotDotToken) : undefined); + } + function rewriteModuleSpecifier(parent: ImportTypeNode, lit: StringLiteral) { if (bundled) { if (context.tracker && context.tracker.moduleResolverHost) { diff --git a/tests/baselines/reference/jsFileCompilationRestParamJsDocFunction.types b/tests/baselines/reference/jsFileCompilationRestParamJsDocFunction.types index ab733f5ab6..c0247bb045 100644 --- a/tests/baselines/reference/jsFileCompilationRestParamJsDocFunction.types +++ b/tests/baselines/reference/jsFileCompilationRestParamJsDocFunction.types @@ -10,7 +10,7 @@ * @returns {*} Returns the result of `func`. */ function apply(func, thisArg, ...args) { ->apply : (func: Function, thisArg: any, ...args: ...*) => any +>apply : (func: Function, thisArg: any, ...args: any[]) => any >func : Function >thisArg : any >args : any[] diff --git a/tests/baselines/reference/jsdocParseDotDotDotInJSDocFunction.types b/tests/baselines/reference/jsdocParseDotDotDotInJSDocFunction.types index 1e9703ccb3..b015f0f50c 100644 --- a/tests/baselines/reference/jsdocParseDotDotDotInJSDocFunction.types +++ b/tests/baselines/reference/jsdocParseDotDotDotInJSDocFunction.types @@ -2,7 +2,7 @@ // from bcryptjs /** @param {function(...[*])} callback */ function g(callback) { ->g : (callback: (arg0: ...[*]) => ) => void +>g : (callback: (...args: [any][]) => ) => void >callback : (...arg0: [any][]) => any callback([1], [2], [3]) diff --git a/tests/baselines/reference/jsdocParseStarEquals.types b/tests/baselines/reference/jsdocParseStarEquals.types index ac7d7f0164..1142fb05da 100644 --- a/tests/baselines/reference/jsdocParseStarEquals.types +++ b/tests/baselines/reference/jsdocParseStarEquals.types @@ -2,7 +2,7 @@ /** @param {...*=} args @return {*=} */ function f(...args) { ->f : (...args: ...*=) => any | undefined +>f : (...args: (any | undefined)[]) => any | undefined >args : any[] return null diff --git a/tests/baselines/reference/jsdocPrefixPostfixParsing.types b/tests/baselines/reference/jsdocPrefixPostfixParsing.types index 1fa8634af7..f13f249121 100644 --- a/tests/baselines/reference/jsdocPrefixPostfixParsing.types +++ b/tests/baselines/reference/jsdocPrefixPostfixParsing.types @@ -15,7 +15,7 @@ * @param {...number?[]!} k - (number[] | null)[] */ function f(x, y, z, a, b, c, e, f, g, h, i, j, k) { ->f : (x: number[], y: number[], z: (number[]), a: (number | null)[], b: number[] | null, c: (number[]) | null, e: ...?number, f: ...?number, g: ...?!number, h: ...!?number, i: ...number[], j: ...?!number[], k: ...!?number[]) => void +>f : (x: number[], y: number[], z: (number[]), a: (number | null)[], b: number[] | null, c: (number[]) | null, e: (number | null)[], f: (number | null)[], g: (number | null)[], h: (number | null)[], i: number[][], j: (number[] | null)[], k: (number | null)[][]) => void >x : number[] >y : number[] >z : number[] diff --git a/tests/baselines/reference/jsdocRestParameter_es6.types b/tests/baselines/reference/jsdocRestParameter_es6.types index faa569a4f2..b07d7d931f 100644 --- a/tests/baselines/reference/jsdocRestParameter_es6.types +++ b/tests/baselines/reference/jsdocRestParameter_es6.types @@ -1,7 +1,7 @@ === /a.js === /** @param {...number} a */ function f(...a) { ->f : (...a: ...number) => void +>f : (...a: number[]) => void >a : number[] a; // number[]