mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Use removeDefinitelyFalsyTypes for building partial type
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 };
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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 };
|
||||
|
||||
Reference in New Issue
Block a user