diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8fea3750d56..a847e68e1af 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -282,6 +282,8 @@ namespace ts { createPromiseType, createArrayType, getBooleanType: () => booleanType, + getFalseType: () => falseType, + getTrueType: () => trueType, getVoidType: () => voidType, getUndefinedType: () => undefinedType, getNullType: () => nullType, @@ -374,9 +376,9 @@ namespace ts { const nullWideningType = strictNullChecks ? nullType : createIntrinsicType(TypeFlags.Null | TypeFlags.ContainsWideningType, "null"); const stringType = createIntrinsicType(TypeFlags.String, "string"); const numberType = createIntrinsicType(TypeFlags.Number, "number"); - const trueType = createIntrinsicType(TypeFlags.BooleanLiteral, "true"); const falseType = createIntrinsicType(TypeFlags.BooleanLiteral, "false"); - const booleanType = createBooleanType([trueType, falseType]); + const trueType = createIntrinsicType(TypeFlags.BooleanLiteral, "true"); + const booleanType = createBooleanType([falseType, trueType]); const esSymbolType = createIntrinsicType(TypeFlags.ESSymbol, "symbol"); const voidType = createIntrinsicType(TypeFlags.Void, "void"); const neverType = createIntrinsicType(TypeFlags.Never, "never"); diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 2b493921f89..726947111be 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -3016,6 +3016,8 @@ namespace ts { /* @internal */ getStringType(): Type; /* @internal */ getNumberType(): Type; /* @internal */ getBooleanType(): Type; + /* @internal */ getFalseType(): Type; + /* @internal */ getTrueType(): Type; /* @internal */ getVoidType(): Type; /* @internal */ getUndefinedType(): Type; /* @internal */ getNullType(): Type; diff --git a/src/services/codefixes/fixStrictClassInitialization.ts b/src/services/codefixes/fixStrictClassInitialization.ts index 40a26da204a..278d1e2d3f6 100644 --- a/src/services/codefixes/fixStrictClassInitialization.ts +++ b/src/services/codefixes/fixStrictClassInitialization.ts @@ -109,14 +109,8 @@ namespace ts.codefix { } function getDefaultValueFromType (checker: TypeChecker, type: Type): Expression | undefined { - if (type.flags & TypeFlags.String) { - return createLiteral(""); - } - else if (type.flags & TypeFlags.Number) { - return createNumericLiteral("0"); - } - else if (type.flags & TypeFlags.Boolean) { - return createFalse(); + if (type.flags & TypeFlags.BooleanLiteral) { + return type === checker.getFalseType() ? createFalse() : createTrue(); } else if (type.isLiteral()) { return createLiteral(type.value); diff --git a/tests/baselines/reference/checkJsxChildrenProperty3.types b/tests/baselines/reference/checkJsxChildrenProperty3.types index 7fbb91bee00..84764f07b7a 100644 --- a/tests/baselines/reference/checkJsxChildrenProperty3.types +++ b/tests/baselines/reference/checkJsxChildrenProperty3.types @@ -38,11 +38,11 @@ class FetchUser extends React.Component { ? this.props.children(this.state.result) >this.props.children(this.state.result) : JSX.Element ->this.props.children : ((user: IUser) => JSX.Element) | (((user: IUser) => JSX.Element) & string) | (((user: IUser) => JSX.Element) & number) | (((user: IUser) => JSX.Element) & true) | (((user: IUser) => JSX.Element) & false) | (((user: IUser) => JSX.Element) & React.ReactElement) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement)[]) +>this.props.children : ((user: IUser) => JSX.Element) | (((user: IUser) => JSX.Element) & string) | (((user: IUser) => JSX.Element) & number) | (((user: IUser) => JSX.Element) & false) | (((user: IUser) => JSX.Element) & true) | (((user: IUser) => JSX.Element) & React.ReactElement) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement)[]) >this.props : IFetchUserProps & { children?: React.ReactNode; } >this : this >props : IFetchUserProps & { children?: React.ReactNode; } ->children : ((user: IUser) => JSX.Element) | (((user: IUser) => JSX.Element) & string) | (((user: IUser) => JSX.Element) & number) | (((user: IUser) => JSX.Element) & true) | (((user: IUser) => JSX.Element) & false) | (((user: IUser) => JSX.Element) & React.ReactElement) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement)[]) +>children : ((user: IUser) => JSX.Element) | (((user: IUser) => JSX.Element) & string) | (((user: IUser) => JSX.Element) & number) | (((user: IUser) => JSX.Element) & false) | (((user: IUser) => JSX.Element) & true) | (((user: IUser) => JSX.Element) & React.ReactElement) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement)[]) >this.state.result : any >this.state : any >this : this diff --git a/tests/baselines/reference/checkJsxChildrenProperty4.types b/tests/baselines/reference/checkJsxChildrenProperty4.types index 6e4c04aa231..6e2ff7fe121 100644 --- a/tests/baselines/reference/checkJsxChildrenProperty4.types +++ b/tests/baselines/reference/checkJsxChildrenProperty4.types @@ -38,11 +38,11 @@ class FetchUser extends React.Component { ? this.props.children(this.state.result) >this.props.children(this.state.result) : JSX.Element ->this.props.children : ((user: IUser) => JSX.Element) | (((user: IUser) => JSX.Element) & string) | (((user: IUser) => JSX.Element) & number) | (((user: IUser) => JSX.Element) & true) | (((user: IUser) => JSX.Element) & false) | (((user: IUser) => JSX.Element) & React.ReactElement) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement)[]) +>this.props.children : ((user: IUser) => JSX.Element) | (((user: IUser) => JSX.Element) & string) | (((user: IUser) => JSX.Element) & number) | (((user: IUser) => JSX.Element) & false) | (((user: IUser) => JSX.Element) & true) | (((user: IUser) => JSX.Element) & React.ReactElement) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement)[]) >this.props : IFetchUserProps & { children?: React.ReactNode; } >this : this >props : IFetchUserProps & { children?: React.ReactNode; } ->children : ((user: IUser) => JSX.Element) | (((user: IUser) => JSX.Element) & string) | (((user: IUser) => JSX.Element) & number) | (((user: IUser) => JSX.Element) & true) | (((user: IUser) => JSX.Element) & false) | (((user: IUser) => JSX.Element) & React.ReactElement) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement)[]) +>children : ((user: IUser) => JSX.Element) | (((user: IUser) => JSX.Element) & string) | (((user: IUser) => JSX.Element) & number) | (((user: IUser) => JSX.Element) & false) | (((user: IUser) => JSX.Element) & true) | (((user: IUser) => JSX.Element) & React.ReactElement) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement)[]) >this.state.result : any >this.state : any >this : this diff --git a/tests/cases/fourslash/codeFixClassPropertyInitialization.ts b/tests/cases/fourslash/codeFixClassPropertyInitialization.ts index 6b7cbbc2705..fd1317ccaeb 100644 --- a/tests/cases/fourslash/codeFixClassPropertyInitialization.ts +++ b/tests/cases/fourslash/codeFixClassPropertyInitialization.ts @@ -12,15 +12,15 @@ //// //// class T { //// -//// a: string; +//// a: boolean; //// -//// static b: string; +//// static b: boolean; //// -//// private c: string; +//// private c: boolean; //// //// d: number | undefined; //// -//// e: string | number; +//// e: string | boolean; //// //// f: 1; //// @@ -46,9 +46,9 @@ function fixes(name: string, type: string, options: { isPrivate?: boolean, noIni } verify.codeFixAvailable([ - ...fixes("a", "string"), - ...fixes("c", "string", { isPrivate: true }), - ...fixes("e", "string | number"), + ...fixes("a", "boolean"), + ...fixes("c", "boolean", { isPrivate: true }), + ...fixes("e", "string | boolean"), ...fixes("f", "1"), ...fixes("g", '"123" | "456"'), ...fixes("h", "boolean"), diff --git a/tests/cases/fourslash/codeFixClassPropertyInitialization3.ts b/tests/cases/fourslash/codeFixClassPropertyInitialization3.ts index 329c6107ac7..8b76da581fe 100644 --- a/tests/cases/fourslash/codeFixClassPropertyInitialization3.ts +++ b/tests/cases/fourslash/codeFixClassPropertyInitialization3.ts @@ -3,13 +3,13 @@ // @strict: true //// class T { -//// a: string; +//// a: boolean; //// } verify.codeFix({ description: `Add initializer to property 'a'`, newFileContent: `class T { - a: string = ""; + a: boolean = false; }`, index: 2 }) \ No newline at end of file diff --git a/tests/cases/fourslash/codeFixClassPropertyInitialization4.ts b/tests/cases/fourslash/codeFixClassPropertyInitialization4.ts deleted file mode 100644 index 17a363e15b3..00000000000 --- a/tests/cases/fourslash/codeFixClassPropertyInitialization4.ts +++ /dev/null @@ -1,15 +0,0 @@ -/// - -// @strict: true - -//// class T { -//// a: number; -//// } - -verify.codeFix({ - description: `Add initializer to property 'a'`, - newFileContent: `class T { - a: number = 0; -}`, - index: 2 -}) \ No newline at end of file diff --git a/tests/cases/fourslash/codeFixClassPropertyInitialization8.ts b/tests/cases/fourslash/codeFixClassPropertyInitialization8.ts index 5c1f7873c16..8af1dd263dd 100644 --- a/tests/cases/fourslash/codeFixClassPropertyInitialization8.ts +++ b/tests/cases/fourslash/codeFixClassPropertyInitialization8.ts @@ -3,13 +3,13 @@ // @strict: true //// class T { -//// a: string | number; +//// a: string | boolean; //// } verify.codeFix({ description: `Add initializer to property 'a'`, newFileContent: `class T { - a: string | number = ""; + a: string | boolean = false; }`, index: 2 }) \ No newline at end of file diff --git a/tests/cases/fourslash/codeFixClassPropertyInitialization_all_3.ts b/tests/cases/fourslash/codeFixClassPropertyInitialization_all_3.ts index 5931c6bd977..29a9fe19b15 100644 --- a/tests/cases/fourslash/codeFixClassPropertyInitialization_all_3.ts +++ b/tests/cases/fourslash/codeFixClassPropertyInitialization_all_3.ts @@ -12,15 +12,15 @@ //// //// class T { //// -//// a: string; +//// a: boolean; //// -//// static b: string; +//// static b: boolean; //// -//// private c: string; +//// private c: boolean; //// //// d: number | undefined; //// -//// e: string | number; +//// e: string | boolean; //// //// f: 1; //// @@ -50,15 +50,15 @@ class Foo {} class T { - a: string = ""; + a: boolean = false; - static b: string; + static b: boolean; - private c: string = ""; + private c: boolean = false; d: number | undefined; - e: string | number = ""; + e: string | boolean = false; f: 1 = 1;