diff --git a/src/services/codefixes/fixJSDocTypes.ts b/src/services/codefixes/fixJSDocTypes.ts
index 27c0edac628..8d5cd562497 100644
--- a/src/services/codefixes/fixJSDocTypes.ts
+++ b/src/services/codefixes/fixJSDocTypes.ts
@@ -8,11 +8,27 @@ namespace ts.codefix {
function getActionsForJSDocTypes(context: CodeFixContext): CodeAction[] | undefined {
const sourceFile = context.sourceFile;
const node = getTokenAtPosition(sourceFile, context.span.start, /*includeJsDocComment*/ false);
+
+ // NOTE: Some locations are not handled yet:
+ // MappedTypeNode.typeParameters and SignatureDeclaration.typeParameters, as well as CallExpression.typeArguments
const decl = ts.findAncestor(node,
- n => n.kind === SyntaxKind.VariableDeclaration ||
+ n =>
+ n.kind === SyntaxKind.AsExpression ||
+ n.kind === SyntaxKind.CallSignature ||
+ n.kind === SyntaxKind.ConstructSignature ||
+ n.kind === SyntaxKind.FunctionDeclaration ||
+ n.kind === SyntaxKind.GetAccessor ||
+ n.kind === SyntaxKind.IndexSignature ||
+ n.kind === SyntaxKind.MappedType ||
+ n.kind === SyntaxKind.MethodDeclaration ||
+ n.kind === SyntaxKind.MethodSignature ||
n.kind === SyntaxKind.Parameter ||
n.kind === SyntaxKind.PropertyDeclaration ||
- n.kind === SyntaxKind.PropertyAssignment);
+ n.kind === SyntaxKind.PropertySignature ||
+ n.kind === SyntaxKind.SetAccessor ||
+ n.kind === SyntaxKind.TypeAliasDeclaration ||
+ n.kind === SyntaxKind.TypeAssertionExpression ||
+ n.kind === SyntaxKind.VariableDeclaration);
if (!decl) return;
const checker = context.program.getTypeChecker();
diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax14.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax14.ts
new file mode 100644
index 00000000000..69478fc3abc
--- /dev/null
+++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax14.ts
@@ -0,0 +1,5 @@
+// @strict: true
+///
+//// var x = 12 as [|number?|];
+
+verify.rangeAfterCodeFix("number | null", /*includeWhiteSpace*/ false, /*errorCode*/ 8020, 0);
diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax15.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax15.ts
new file mode 100644
index 00000000000..9482830c19d
--- /dev/null
+++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax15.ts
@@ -0,0 +1,5 @@
+///
+//// var f = <[|function(number?): number|]>(x => x);
+
+// note: without --strict, number? --> number, not number | null
+verify.rangeAfterCodeFix("(arg0: number) => number", /*includeWhiteSpace*/ false, /*errorCode*/ 8020, 0);
diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax16.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax16.ts
new file mode 100644
index 00000000000..111aec1dce7
--- /dev/null
+++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax16.ts
@@ -0,0 +1,4 @@
+///
+//// var f: { [K in keyof number]: [|*|] };
+
+verify.rangeAfterCodeFix("any");
diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax17.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax17.ts
new file mode 100644
index 00000000000..6a3ce2ed3df
--- /dev/null
+++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax17.ts
@@ -0,0 +1,3 @@
+///
+//// declare function index(ix: number): [|*|];
+verify.rangeAfterCodeFix("any");
diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax18.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax18.ts
new file mode 100644
index 00000000000..30a3815516a
--- /dev/null
+++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax18.ts
@@ -0,0 +1,3 @@
+///
+//// var index: { (ix: number): [|?|] };
+verify.rangeAfterCodeFix("any");
diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax19.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax19.ts
new file mode 100644
index 00000000000..e6344881227
--- /dev/null
+++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax19.ts
@@ -0,0 +1,3 @@
+///
+//// var index: { new (ix: number): [|?|] };
+verify.rangeAfterCodeFix("any");
diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax20.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax20.ts
new file mode 100644
index 00000000000..dc153730841
--- /dev/null
+++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax20.ts
@@ -0,0 +1,3 @@
+///
+//// var index = { get p(): [|*|] { return 12 } };
+verify.rangeAfterCodeFix("any");
diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax21.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax21.ts
new file mode 100644
index 00000000000..442414e4577
--- /dev/null
+++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax21.ts
@@ -0,0 +1,3 @@
+///
+//// var index = { set p(x: [|*|]) { } };
+verify.rangeAfterCodeFix("any");
diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax22.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax22.ts
new file mode 100644
index 00000000000..c575f1ca7ce
--- /dev/null
+++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax22.ts
@@ -0,0 +1,3 @@
+///
+//// var index: { [s: string]: [|*|] };
+verify.rangeAfterCodeFix("any");
diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax23.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax23.ts
new file mode 100644
index 00000000000..7ab70e18ee7
--- /dev/null
+++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax23.ts
@@ -0,0 +1,6 @@
+///
+////class C {
+//// m(): [|*|] {
+//// }
+////}
+verify.rangeAfterCodeFix("any");
diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax24.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax24.ts
new file mode 100644
index 00000000000..7ea2d1f6faf
--- /dev/null
+++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax24.ts
@@ -0,0 +1,5 @@
+///
+////declare class C {
+//// m(): [|*|];
+////}
+verify.rangeAfterCodeFix("any");
diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax25.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax25.ts
new file mode 100644
index 00000000000..6486a70417e
--- /dev/null
+++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax25.ts
@@ -0,0 +1,5 @@
+///
+////declare class C {
+//// p: [|*|];
+////}
+verify.rangeAfterCodeFix("any");
diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax26.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax26.ts
new file mode 100644
index 00000000000..dc31f1dfffd
--- /dev/null
+++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax26.ts
@@ -0,0 +1,5 @@
+///
+////class C {
+//// p: [|*|] = 12;
+////}
+verify.rangeAfterCodeFix("any");
diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax27.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax27.ts
new file mode 100644
index 00000000000..255976c7767
--- /dev/null
+++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax27.ts
@@ -0,0 +1,4 @@
+// @strict: true
+///
+////type T = [|...number?|];
+verify.rangeAfterCodeFix("(number | null)[]");