diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts
index 4d6eb8f7a99e6..87f3855e1830d 100644
--- a/src/services/formatting/rules.ts
+++ b/src/services/formatting/rules.ts
@@ -52,7 +52,7 @@ namespace ts.formatting {
rule("NotSpaceBeforeColon", anyToken, SyntaxKind.ColonToken, [isNonJsxSameLineTokenContext, isNotBinaryOpContext, isNotTypeAnnotationContext], RuleAction.DeleteSpace),
rule("SpaceAfterColon", SyntaxKind.ColonToken, anyToken, [isNonJsxSameLineTokenContext, isNotBinaryOpContext], RuleAction.InsertSpace),
- rule("NoSpaceBeforeQuestionMark", anyToken, SyntaxKind.QuestionToken, [isNonJsxSameLineTokenContext, isNotBinaryOpContext], RuleAction.DeleteSpace),
+ rule("NoSpaceBeforeQuestionMark", anyToken, SyntaxKind.QuestionToken, [isNonJsxSameLineTokenContext, isNotBinaryOpContext, isNotTypeAnnotationContext], RuleAction.DeleteSpace),
// insert space after '?' only when it is used in conditional operator
rule("SpaceAfterQuestionMarkInConditionalOperator", SyntaxKind.QuestionToken, anyToken, [isNonJsxSameLineTokenContext, isConditionalOperatorContext], RuleAction.InsertSpace),
@@ -315,8 +315,9 @@ namespace ts.formatting {
rule("SpaceAfterTypeAssertion", SyntaxKind.GreaterThanToken, anyToken, [isOptionEnabled("insertSpaceAfterTypeAssertion"), isNonJsxSameLineTokenContext, isTypeAssertionContext], RuleAction.InsertSpace),
rule("NoSpaceAfterTypeAssertion", SyntaxKind.GreaterThanToken, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterTypeAssertion"), isNonJsxSameLineTokenContext, isTypeAssertionContext], RuleAction.DeleteSpace),
- rule("SpaceBeforeTypeAnnotation", anyToken, SyntaxKind.ColonToken, [isOptionEnabled("insertSpaceBeforeTypeAnnotation"), isNonJsxSameLineTokenContext, isTypeAnnotationContext], RuleAction.InsertSpace),
- rule("NoSpaceBeforeTypeAnnotation", anyToken, SyntaxKind.ColonToken, [isOptionDisabledOrUndefined("insertSpaceBeforeTypeAnnotation"), isNonJsxSameLineTokenContext, isTypeAnnotationContext], RuleAction.DeleteSpace),
+ rule("SpaceBeforeTypeAnnotation", anyToken, [SyntaxKind.QuestionToken, SyntaxKind.ColonToken], [isOptionEnabled("insertSpaceBeforeTypeAnnotation"), isNonJsxSameLineTokenContext, isTypeAnnotationContext], RuleAction.InsertSpace),
+ rule("NoSpaceBeforeTypeAnnotation", anyToken, [SyntaxKind.QuestionToken, SyntaxKind.ColonToken], [isOptionDisabledOrUndefined("insertSpaceBeforeTypeAnnotation"), isNonJsxSameLineTokenContext, isTypeAnnotationContext], RuleAction.DeleteSpace),
+
rule("NoOptionalSemicolon", SyntaxKind.SemicolonToken, anyTokenIncludingEOF, [optionEquals("semicolons", SemicolonPreference.Remove), isSemicolonDeletionContext], RuleAction.DeleteToken),
rule("OptionalSemicolon", anyToken, anyTokenIncludingEOF, [optionEquals("semicolons", SemicolonPreference.Insert), isSemicolonInsertionContext], RuleAction.InsertTrailingSemicolon),
];
diff --git a/tests/cases/fourslash/formatTypeAnnotation1.ts b/tests/cases/fourslash/formatTypeAnnotation1.ts
new file mode 100644
index 0000000000000..edd3a13ab9bc6
--- /dev/null
+++ b/tests/cases/fourslash/formatTypeAnnotation1.ts
@@ -0,0 +1,17 @@
+///
+
+////function foo(x: number, y?: string): number {}
+////interface Foo {
+//// x: number;
+//// y?: number;
+////}
+
+format.setOption("insertSpaceBeforeTypeAnnotation", true);
+format.document();
+verify.currentFileContentIs(
+`function foo(x : number, y ?: string) : number { }
+interface Foo {
+ x : number;
+ y ?: number;
+}`
+);
diff --git a/tests/cases/fourslash/formatTypeAnnotation2.ts b/tests/cases/fourslash/formatTypeAnnotation2.ts
new file mode 100644
index 0000000000000..a3708a6b66893
--- /dev/null
+++ b/tests/cases/fourslash/formatTypeAnnotation2.ts
@@ -0,0 +1,16 @@
+///
+
+////function foo(x : number, y ?: string) : number {}
+////interface Foo {
+//// x : number;
+//// y ?: number;
+////}
+
+format.document();
+verify.currentFileContentIs(
+`function foo(x: number, y?: string): number { }
+interface Foo {
+ x: number;
+ y?: number;
+}`
+);