Use removeDefinitelyFalsyTypes for building partial type

This commit is contained in:
Nathan Shively-Sanders
2017-09-14 11:18:48 -07:00
parent 274faa4e9c
commit 18653a5c5d
6 changed files with 63 additions and 72 deletions
+4 -9
View File
@@ -7923,15 +7923,10 @@ namespace ts {
function getPartialTypeFromFalsyUnion(type: UnionType): Type | undefined {
if (type.types.length === 2) {
// getFalsyFlagsOfTypes
// getTypeFacts
const i = Math.max(type.types.indexOf(falseType),
type.types.indexOf(zeroType),
type.types.indexOf(emptyStringType));
if (i > -1) {
const truthy = removeDefinitelyFalsyTypes(type);
if (truthy !== type) {
const members = createSymbolTable();
const other = type.types[i === 0 ? 1 : 0];
for (const prop of getPropertiesOfType(other)) {
for (const prop of getPropertiesOfType(truthy)) {
if (prop.flags & SymbolFlags.Optional) {
members.set(prop.escapedName, prop);
}
@@ -7943,7 +7938,7 @@ namespace ts {
members.set(prop.escapedName, result);
}
}
return createAnonymousType(undefined, members, emptyArray, emptyArray, getIndexInfoOfType(other, IndexKind.String), getIndexInfoOfType(other, IndexKind.Number));
return createAnonymousType(undefined, members, emptyArray, emptyArray, getIndexInfoOfType(truthy, IndexKind.String), getIndexInfoOfType(truthy, IndexKind.Number));
}
}
}
+5 -5
View File
@@ -3,20 +3,20 @@ declare const undefinedUnion: { a: number } | undefined;
declare const nullUnion: { b: number } | null;
declare const nullAndUndefinedUnion: null | undefined;
var o1: {} | { a: number };
var o1: { a?: number | undefined };
var o1 = { ...undefinedUnion };
var o2: {} | { b: number };
var o2: { b?: number | undefined };
var o2 = { ...nullUnion };
var o3: {} | { b: number } | { a: number } | { a: number, b: number };
var o3: { a?: number | undefined, b?: number | undefined };
var o3 = { ...undefinedUnion, ...nullUnion };
var o3 = { ...nullUnion, ...undefinedUnion };
var o4: {} | { a: number };
var o4: { a?: number | undefined };
var o4 = { ...undefinedUnion, ...undefinedUnion };
var o5: {} | { b: number };
var o5: { b?: number | undefined };
var o5 = { ...nullUnion, ...nullUnion };
var o6 = { ...nullAndUndefinedUnion, ...nullAndUndefinedUnion };
+11 -13
View File
@@ -10,28 +10,26 @@ declare const nullUnion: { b: number } | null;
declare const nullAndUndefinedUnion: null | undefined;
>nullAndUndefinedUnion : Symbol(nullAndUndefinedUnion, Decl(spreadUnion2.ts, 2, 13))
var o1: {} | { a: number };
var o1: { a?: number | undefined };
>o1 : Symbol(o1, Decl(spreadUnion2.ts, 4, 3), Decl(spreadUnion2.ts, 5, 3))
>a : Symbol(a, Decl(spreadUnion2.ts, 4, 14))
>a : Symbol(a, Decl(spreadUnion2.ts, 4, 9))
var o1 = { ...undefinedUnion };
>o1 : Symbol(o1, Decl(spreadUnion2.ts, 4, 3), Decl(spreadUnion2.ts, 5, 3))
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
var o2: {} | { b: number };
var o2: { b?: number | undefined };
>o2 : Symbol(o2, Decl(spreadUnion2.ts, 7, 3), Decl(spreadUnion2.ts, 8, 3))
>b : Symbol(b, Decl(spreadUnion2.ts, 7, 14))
>b : Symbol(b, Decl(spreadUnion2.ts, 7, 9))
var o2 = { ...nullUnion };
>o2 : Symbol(o2, Decl(spreadUnion2.ts, 7, 3), Decl(spreadUnion2.ts, 8, 3))
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
var o3: {} | { b: number } | { a: number } | { a: number, b: number };
var o3: { a?: number | undefined, b?: number | undefined };
>o3 : Symbol(o3, Decl(spreadUnion2.ts, 10, 3), Decl(spreadUnion2.ts, 11, 3), Decl(spreadUnion2.ts, 12, 3))
>b : Symbol(b, Decl(spreadUnion2.ts, 10, 14))
>a : Symbol(a, Decl(spreadUnion2.ts, 10, 30))
>a : Symbol(a, Decl(spreadUnion2.ts, 10, 46))
>b : Symbol(b, Decl(spreadUnion2.ts, 10, 57))
>a : Symbol(a, Decl(spreadUnion2.ts, 10, 9))
>b : Symbol(b, Decl(spreadUnion2.ts, 10, 33))
var o3 = { ...undefinedUnion, ...nullUnion };
>o3 : Symbol(o3, Decl(spreadUnion2.ts, 10, 3), Decl(spreadUnion2.ts, 11, 3), Decl(spreadUnion2.ts, 12, 3))
@@ -43,18 +41,18 @@ var o3 = { ...nullUnion, ...undefinedUnion };
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
var o4: {} | { a: number };
var o4: { a?: number | undefined };
>o4 : Symbol(o4, Decl(spreadUnion2.ts, 14, 3), Decl(spreadUnion2.ts, 15, 3))
>a : Symbol(a, Decl(spreadUnion2.ts, 14, 14))
>a : Symbol(a, Decl(spreadUnion2.ts, 14, 9))
var o4 = { ...undefinedUnion, ...undefinedUnion };
>o4 : Symbol(o4, Decl(spreadUnion2.ts, 14, 3), Decl(spreadUnion2.ts, 15, 3))
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
var o5: {} | { b: number };
var o5: { b?: number | undefined };
>o5 : Symbol(o5, Decl(spreadUnion2.ts, 17, 3), Decl(spreadUnion2.ts, 18, 3))
>b : Symbol(b, Decl(spreadUnion2.ts, 17, 14))
>b : Symbol(b, Decl(spreadUnion2.ts, 17, 9))
var o5 = { ...nullUnion, ...nullUnion };
>o5 : Symbol(o5, Decl(spreadUnion2.ts, 17, 3), Decl(spreadUnion2.ts, 18, 3))
+32 -34
View File
@@ -12,71 +12,69 @@ declare const nullAndUndefinedUnion: null | undefined;
>nullAndUndefinedUnion : null | undefined
>null : null
var o1: {} | { a: number };
>o1 : {} | { a: number; }
>a : number
var o1: { a?: number | undefined };
>o1 : { a?: number | undefined; }
>a : number | undefined
var o1 = { ...undefinedUnion };
>o1 : {} | { a: number; }
>{ ...undefinedUnion } : {} | { a: number; }
>o1 : { a?: number | undefined; }
>{ ...undefinedUnion } : { a?: number | undefined; }
>undefinedUnion : { a: number; } | undefined
var o2: {} | { b: number };
>o2 : {} | { b: number; }
>b : number
var o2: { b?: number | undefined };
>o2 : { b?: number | undefined; }
>b : number | undefined
var o2 = { ...nullUnion };
>o2 : {} | { b: number; }
>{ ...nullUnion } : {} | { b: number; }
>o2 : { b?: number | undefined; }
>{ ...nullUnion } : { b?: number | undefined; }
>nullUnion : { b: number; } | null
var o3: {} | { b: number } | { a: number } | { a: number, b: number };
>o3 : {} | { b: number; } | { a: number; } | { a: number; b: number; }
>b : number
>a : number
>a : number
>b : number
var o3: { a?: number | undefined, b?: number | undefined };
>o3 : { a?: number | undefined; b?: number | undefined; }
>a : number | undefined
>b : number | undefined
var o3 = { ...undefinedUnion, ...nullUnion };
>o3 : {} | { b: number; } | { a: number; } | { a: number; b: number; }
>{ ...undefinedUnion, ...nullUnion } : {} | { b: number; } | { a: number; } | { b: number; a: number; }
>o3 : { a?: number | undefined; b?: number | undefined; }
>{ ...undefinedUnion, ...nullUnion } : { b?: number | undefined; a?: number | undefined; }
>undefinedUnion : { a: number; } | undefined
>nullUnion : { b: number; } | null
var o3 = { ...nullUnion, ...undefinedUnion };
>o3 : {} | { b: number; } | { a: number; } | { a: number; b: number; }
>{ ...nullUnion, ...undefinedUnion } : {} | { a: number; } | { b: number; } | { a: number; b: number; }
>o3 : { a?: number | undefined; b?: number | undefined; }
>{ ...nullUnion, ...undefinedUnion } : { a?: number | undefined; b?: number | undefined; }
>nullUnion : { b: number; } | null
>undefinedUnion : { a: number; } | undefined
var o4: {} | { a: number };
>o4 : {} | { a: number; }
>a : number
var o4: { a?: number | undefined };
>o4 : { a?: number | undefined; }
>a : number | undefined
var o4 = { ...undefinedUnion, ...undefinedUnion };
>o4 : {} | { a: number; }
>{ ...undefinedUnion, ...undefinedUnion } : {} | { a: number; } | { a: number; } | { a: number; }
>o4 : { a?: number | undefined; }
>{ ...undefinedUnion, ...undefinedUnion } : { a?: number | undefined; }
>undefinedUnion : { a: number; } | undefined
>undefinedUnion : { a: number; } | undefined
var o5: {} | { b: number };
>o5 : {} | { b: number; }
>b : number
var o5: { b?: number | undefined };
>o5 : { b?: number | undefined; }
>b : number | undefined
var o5 = { ...nullUnion, ...nullUnion };
>o5 : {} | { b: number; }
>{ ...nullUnion, ...nullUnion } : {} | { b: number; } | { b: number; } | { b: number; }
>o5 : { b?: number | undefined; }
>{ ...nullUnion, ...nullUnion } : { b?: number | undefined; }
>nullUnion : { b: number; } | null
>nullUnion : { b: number; } | null
var o6 = { ...nullAndUndefinedUnion, ...nullAndUndefinedUnion };
>o6 : {} | {} | {} | {}
>{ ...nullAndUndefinedUnion, ...nullAndUndefinedUnion } : {} | {} | {} | {}
>o6 : {}
>{ ...nullAndUndefinedUnion, ...nullAndUndefinedUnion } : {}
>nullAndUndefinedUnion : null | undefined
>nullAndUndefinedUnion : null | undefined
var o7 = { ...nullAndUndefinedUnion };
>o7 : {} | {}
>{ ...nullAndUndefinedUnion } : {} | {}
>o7 : {}
>{ ...nullAndUndefinedUnion } : {}
>nullAndUndefinedUnion : null | undefined
@@ -1,6 +1,6 @@
tests/cases/conformance/types/spread/spreadUnion3.ts(2,5): error TS2322: Type '{ y: number; } | { y: string; }' is not assignable to type '{ y: string; }'.
Type '{ y: number; }' is not assignable to type '{ y: string; }'.
Types of property 'y' are incompatible.
tests/cases/conformance/types/spread/spreadUnion3.ts(2,5): error TS2322: Type '{ y: string | number; }' is not assignable to type '{ y: string; }'.
Types of property 'y' are incompatible.
Type 'string | number' is not assignable to type 'string'.
Type 'number' is not assignable to type 'string'.
tests/cases/conformance/types/spread/spreadUnion3.ts(9,23): error TS2339: Property 'a' does not exist on type '{} | {} | { a: number; }'.
Property 'a' does not exist on type '{}'.
@@ -10,9 +10,9 @@ tests/cases/conformance/types/spread/spreadUnion3.ts(9,23): error TS2339: Proper
function f(x: { y: string } | undefined): { y: string } {
return { y: 123, ...x } // y: string | number
~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2322: Type '{ y: number; } | { y: string; }' is not assignable to type '{ y: string; }'.
!!! error TS2322: Type '{ y: number; }' is not assignable to type '{ y: string; }'.
!!! error TS2322: Types of property 'y' are incompatible.
!!! error TS2322: Type '{ y: string | number; }' is not assignable to type '{ y: string; }'.
!!! error TS2322: Types of property 'y' are incompatible.
!!! error TS2322: Type 'string | number' is not assignable to type 'string'.
!!! error TS2322: Type 'number' is not assignable to type 'string'.
}
f(undefined)
@@ -4,20 +4,20 @@ declare const undefinedUnion: { a: number } | undefined;
declare const nullUnion: { b: number } | null;
declare const nullAndUndefinedUnion: null | undefined;
var o1: {} | { a: number };
var o1: { a?: number | undefined };
var o1 = { ...undefinedUnion };
var o2: {} | { b: number };
var o2: { b?: number | undefined };
var o2 = { ...nullUnion };
var o3: {} | { b: number } | { a: number } | { a: number, b: number };
var o3: { a?: number | undefined, b?: number | undefined };
var o3 = { ...undefinedUnion, ...nullUnion };
var o3 = { ...nullUnion, ...undefinedUnion };
var o4: {} | { a: number };
var o4: { a?: number | undefined };
var o4 = { ...undefinedUnion, ...undefinedUnion };
var o5: {} | { b: number };
var o5: { b?: number | undefined };
var o5 = { ...nullUnion, ...nullUnion };
var o6 = { ...nullAndUndefinedUnion, ...nullAndUndefinedUnion };