Skip to content

Commit 48dedac

Browse files
author
Andy
authored
fixStrictClassInitialization: Don't provide a default for string or number (microsoft#24767)
* fixStrictClassInitialization: Don't provide a default for `string` or `number` * Update baselines
1 parent 33d0893 commit 48dedac

10 files changed

Lines changed: 31 additions & 48 deletions

src/compiler/checker.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,8 @@ namespace ts {
282282
createPromiseType,
283283
createArrayType,
284284
getBooleanType: () => booleanType,
285+
getFalseType: () => falseType,
286+
getTrueType: () => trueType,
285287
getVoidType: () => voidType,
286288
getUndefinedType: () => undefinedType,
287289
getNullType: () => nullType,
@@ -374,9 +376,9 @@ namespace ts {
374376
const nullWideningType = strictNullChecks ? nullType : createIntrinsicType(TypeFlags.Null | TypeFlags.ContainsWideningType, "null");
375377
const stringType = createIntrinsicType(TypeFlags.String, "string");
376378
const numberType = createIntrinsicType(TypeFlags.Number, "number");
377-
const trueType = createIntrinsicType(TypeFlags.BooleanLiteral, "true");
378379
const falseType = createIntrinsicType(TypeFlags.BooleanLiteral, "false");
379-
const booleanType = createBooleanType([trueType, falseType]);
380+
const trueType = createIntrinsicType(TypeFlags.BooleanLiteral, "true");
381+
const booleanType = createBooleanType([falseType, trueType]);
380382
const esSymbolType = createIntrinsicType(TypeFlags.ESSymbol, "symbol");
381383
const voidType = createIntrinsicType(TypeFlags.Void, "void");
382384
const neverType = createIntrinsicType(TypeFlags.Never, "never");

src/compiler/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3016,6 +3016,8 @@ namespace ts {
30163016
/* @internal */ getStringType(): Type;
30173017
/* @internal */ getNumberType(): Type;
30183018
/* @internal */ getBooleanType(): Type;
3019+
/* @internal */ getFalseType(): Type;
3020+
/* @internal */ getTrueType(): Type;
30193021
/* @internal */ getVoidType(): Type;
30203022
/* @internal */ getUndefinedType(): Type;
30213023
/* @internal */ getNullType(): Type;

src/services/codefixes/fixStrictClassInitialization.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,8 @@ namespace ts.codefix {
109109
}
110110

111111
function getDefaultValueFromType (checker: TypeChecker, type: Type): Expression | undefined {
112-
if (type.flags & TypeFlags.String) {
113-
return createLiteral("");
114-
}
115-
else if (type.flags & TypeFlags.Number) {
116-
return createNumericLiteral("0");
117-
}
118-
else if (type.flags & TypeFlags.Boolean) {
119-
return createFalse();
112+
if (type.flags & TypeFlags.BooleanLiteral) {
113+
return type === checker.getFalseType() ? createFalse() : createTrue();
120114
}
121115
else if (type.isLiteral()) {
122116
return createLiteral(type.value);

tests/baselines/reference/checkJsxChildrenProperty3.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ class FetchUser extends React.Component<IFetchUserProps, any> {
3838

3939
? this.props.children(this.state.result)
4040
>this.props.children(this.state.result) : JSX.Element
41-
>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<any>) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement<any>)[])
41+
>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<any>) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement<any>)[])
4242
>this.props : IFetchUserProps & { children?: React.ReactNode; }
4343
>this : this
4444
>props : IFetchUserProps & { children?: React.ReactNode; }
45-
>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<any>) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement<any>)[])
45+
>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<any>) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement<any>)[])
4646
>this.state.result : any
4747
>this.state : any
4848
>this : this

tests/baselines/reference/checkJsxChildrenProperty4.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ class FetchUser extends React.Component<IFetchUserProps, any> {
3838

3939
? this.props.children(this.state.result)
4040
>this.props.children(this.state.result) : JSX.Element
41-
>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<any>) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement<any>)[])
41+
>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<any>) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement<any>)[])
4242
>this.props : IFetchUserProps & { children?: React.ReactNode; }
4343
>this : this
4444
>props : IFetchUserProps & { children?: React.ReactNode; }
45-
>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<any>) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement<any>)[])
45+
>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<any>) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement<any>)[])
4646
>this.state.result : any
4747
>this.state : any
4848
>this : this

tests/cases/fourslash/codeFixClassPropertyInitialization.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@
1212
////
1313
//// class T {
1414
////
15-
//// a: string;
15+
//// a: boolean;
1616
////
17-
//// static b: string;
17+
//// static b: boolean;
1818
////
19-
//// private c: string;
19+
//// private c: boolean;
2020
////
2121
//// d: number | undefined;
2222
////
23-
//// e: string | number;
23+
//// e: string | boolean;
2424
////
2525
//// f: 1;
2626
////
@@ -46,9 +46,9 @@ function fixes(name: string, type: string, options: { isPrivate?: boolean, noIni
4646
}
4747

4848
verify.codeFixAvailable([
49-
...fixes("a", "string"),
50-
...fixes("c", "string", { isPrivate: true }),
51-
...fixes("e", "string | number"),
49+
...fixes("a", "boolean"),
50+
...fixes("c", "boolean", { isPrivate: true }),
51+
...fixes("e", "string | boolean"),
5252
...fixes("f", "1"),
5353
...fixes("g", '"123" | "456"'),
5454
...fixes("h", "boolean"),

tests/cases/fourslash/codeFixClassPropertyInitialization3.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
// @strict: true
44

55
//// class T {
6-
//// a: string;
6+
//// a: boolean;
77
//// }
88

99
verify.codeFix({
1010
description: `Add initializer to property 'a'`,
1111
newFileContent: `class T {
12-
a: string = "";
12+
a: boolean = false;
1313
}`,
1414
index: 2
1515
})

tests/cases/fourslash/codeFixClassPropertyInitialization4.ts

Lines changed: 0 additions & 15 deletions
This file was deleted.

tests/cases/fourslash/codeFixClassPropertyInitialization8.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
// @strict: true
44

55
//// class T {
6-
//// a: string | number;
6+
//// a: string | boolean;
77
//// }
88

99
verify.codeFix({
1010
description: `Add initializer to property 'a'`,
1111
newFileContent: `class T {
12-
a: string | number = "";
12+
a: string | boolean = false;
1313
}`,
1414
index: 2
1515
})

tests/cases/fourslash/codeFixClassPropertyInitialization_all_3.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@
1212
////
1313
//// class T {
1414
////
15-
//// a: string;
15+
//// a: boolean;
1616
////
17-
//// static b: string;
17+
//// static b: boolean;
1818
////
19-
//// private c: string;
19+
//// private c: boolean;
2020
////
2121
//// d: number | undefined;
2222
////
23-
//// e: string | number;
23+
//// e: string | boolean;
2424
////
2525
//// f: 1;
2626
////
@@ -50,15 +50,15 @@ class Foo {}
5050
5151
class T {
5252
53-
a: string = "";
53+
a: boolean = false;
5454
55-
static b: string;
55+
static b: boolean;
5656
57-
private c: string = "";
57+
private c: boolean = false;
5858
5959
d: number | undefined;
6060
61-
e: string | number = "";
61+
e: string | boolean = false;
6262
6363
f: 1 = 1;
6464

0 commit comments

Comments
 (0)