fixStrictClassInitialization: Don't provide a default for string or number (#24767)

* fixStrictClassInitialization: Don't provide a default for `string` or `number`

* Update baselines
This commit is contained in:
Andy
2018-06-07 15:03:38 -07:00
committed by GitHub
parent 33d0893259
commit 48dedacf3b
10 changed files with 31 additions and 48 deletions
+4 -2
View File
@@ -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");
+2
View File
@@ -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;
@@ -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);
@@ -38,11 +38,11 @@ class FetchUser extends React.Component<IFetchUserProps, any> {
? 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<any>) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement<any>)[])
>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>)[])
>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<any>) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement<any>)[])
>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>)[])
>this.state.result : any
>this.state : any
>this : this
@@ -38,11 +38,11 @@ class FetchUser extends React.Component<IFetchUserProps, any> {
? 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<any>) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement<any>)[])
>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>)[])
>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<any>) | (((user: IUser) => JSX.Element) & (string | number | boolean | any[] | React.ReactElement<any>)[])
>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>)[])
>this.state.result : any
>this.state : any
>this : this
@@ -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"),
@@ -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
})
@@ -1,15 +0,0 @@
/// <reference path='fourslash.ts' />
// @strict: true
//// class T {
//// a: number;
//// }
verify.codeFix({
description: `Add initializer to property 'a'`,
newFileContent: `class T {
a: number = 0;
}`,
index: 2
})
@@ -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
})
@@ -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;