diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 61f9773c7a0..808e8aeaf81 100755 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -578,10 +578,10 @@ namespace ts { return emitLiteralType(node); case SyntaxKind.JSDocAllType: write("*"); - break; + return; case SyntaxKind.JSDocUnknownType: write("?"); - break; + return; case SyntaxKind.JSDocNullableType: return emitJSDocNullableType(node as JSDocNullableType); case SyntaxKind.JSDocNonNullableType: diff --git a/src/services/refactors/annotateWithTypeFromJSDoc.ts b/src/services/refactors/annotateWithTypeFromJSDoc.ts index dde367f0ac9..3111c0d3ed9 100644 --- a/src/services/refactors/annotateWithTypeFromJSDoc.ts +++ b/src/services/refactors/annotateWithTypeFromJSDoc.ts @@ -189,8 +189,11 @@ namespace ts.refactor.annotateWithTypeFromJSDoc { } function visitJSDocParameter(node: ParameterDeclaration) { - const name = node.name || "arg" + node.parent.parameters.indexOf(node); - return createParameter(node.decorators, node.modifiers, node.dotDotDotToken, name, node.questionToken, node.type, node.initializer); + const index = node.parent.parameters.indexOf(node); + const isRest = node.type.kind === SyntaxKind.JSDocVariadicType && index === node.parent.parameters.length - 1; + const name = node.name || (isRest ? "rest" : "arg" + index); + const dotdotdot = isRest ? createToken(SyntaxKind.DotDotDotToken) : node.dotDotDotToken; + return createParameter(node.decorators, node.modifiers, dotdotdot, name, node.questionToken, visitNode(node.type, transformJSDocType), node.initializer); } function visitJSDocTypeReference(node: TypeReferenceNode) { diff --git a/tests/cases/fourslash/annotateWithTypeFromJSDoc16.ts b/tests/cases/fourslash/annotateWithTypeFromJSDoc16.ts new file mode 100644 index 00000000000..2f5ab2bcc72 --- /dev/null +++ b/tests/cases/fourslash/annotateWithTypeFromJSDoc16.ts @@ -0,0 +1,9 @@ +/// +// @strict: true +/////** @type {function(*, ...number, ...boolean): void} */ +////var /*1*/x; + +verify.applicableRefactorAvailableAtMarker('1'); +verify.fileAfterApplyingRefactorAtMarker('1', +`/** @type {function(*, ...number, ...boolean): void} */ +var x: (arg0: any, arg1: number[], ...rest: boolean[]) => void;`, 'Annotate with type from JSDoc', 'annotate');