Skip to content

Commit cb8d9d6

Browse files
committed
Revert spread-falsy-union/fix spread of primitive
Turns out partialising falsy unions wasn't needed -- I was just returning the wrong thing when spreading primitives.
1 parent 0197357 commit cb8d9d6

8 files changed

Lines changed: 92 additions & 102 deletions

File tree

src/compiler/checker.ts

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7846,7 +7846,6 @@ namespace ts {
78467846
* and right = the new element to be spread.
78477847
*/
78487848
function getSpreadType(left: Type, right: Type): Type {
7849-
let truthyRight: Type;
78507849
if (left.flags & TypeFlags.Any || right.flags & TypeFlags.Any) {
78517850
return anyType;
78527851
}
@@ -7860,16 +7859,13 @@ namespace ts {
78607859
return mapType(left, t => getSpreadType(t, right));
78617860
}
78627861
if (right.flags & TypeFlags.Union) {
7863-
truthyRight = getTruthyTypeFromFalsyUnion(right as UnionType);
7864-
if (!truthyRight || truthyRight.flags & TypeFlags.Union) {
7865-
return mapType(right, t => getSpreadType(left, t));
7866-
}
7867-
else {
7868-
right = truthyRight;
7869-
}
7862+
return mapType(right, t => getSpreadType(left, t));
78707863
}
7871-
if (right.flags & (TypeFlags.NonPrimitive | TypeFlags.BooleanLike | TypeFlags.NumberLike | TypeFlags.StringLike | TypeFlags.EnumLike)) {
7872-
return emptyObjectType;
7864+
if (right.flags & TypeFlags.NonPrimitive) {
7865+
return nonPrimitiveType;
7866+
}
7867+
if (right.flags & (TypeFlags.BooleanLike | TypeFlags.NumberLike | TypeFlags.StringLike | TypeFlags.EnumLike)) {
7868+
return left;
78737869
}
78747870

78757871
const members = createSymbolTable();
@@ -7893,7 +7889,7 @@ namespace ts {
78937889
skippedPrivateMembers.set(rightProp.escapedName, true);
78947890
}
78957891
else if (!isClassMethod(rightProp) && !isSetterWithoutGetter) {
7896-
members.set(rightProp.escapedName, getSymbolOfSpreadProperty(rightProp, !!truthyRight));
7892+
members.set(rightProp.escapedName, getNonReadonlySymbol(rightProp));
78977893
}
78987894
}
78997895

@@ -7918,22 +7914,19 @@ namespace ts {
79187914
}
79197915
}
79207916
else {
7921-
members.set(leftProp.escapedName, getSymbolOfSpreadProperty(leftProp, /*makeOptional*/ false));
7917+
members.set(leftProp.escapedName, getNonReadonlySymbol(leftProp));
79227918
}
79237919
}
79247920
return createAnonymousType(undefined, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
79257921
}
79267922

7927-
function getSymbolOfSpreadProperty(prop: Symbol, makeOptional: boolean) {
7928-
if (!isReadonlySymbol(prop) && (!makeOptional || prop.flags & SymbolFlags.Optional)) {
7923+
function getNonReadonlySymbol(prop: Symbol) {
7924+
if (!isReadonlySymbol(prop)) {
79297925
return prop;
79307926
}
7931-
const flags = SymbolFlags.Property | (makeOptional ? SymbolFlags.Optional : prop.flags & SymbolFlags.Optional);
7927+
const flags = SymbolFlags.Property | (prop.flags & SymbolFlags.Optional);
79327928
const result = createSymbol(flags, prop.escapedName);
79337929
result.type = getTypeOfSymbol(prop);
7934-
if (makeOptional) {
7935-
result.type = getUnionType([result.type, undefinedType]);
7936-
}
79377930
result.declarations = prop.declarations;
79387931
result.syntheticOrigin = prop;
79397932
return result;
@@ -7943,13 +7936,6 @@ namespace ts {
79437936
return prop.flags & SymbolFlags.Method && find(prop.declarations, decl => isClassLike(decl.parent));
79447937
}
79457938

7946-
function getTruthyTypeFromFalsyUnion(type: UnionType): Type | undefined {
7947-
const truthy = removeDefinitelyFalsyTypes(type);
7948-
if (truthy !== type) {
7949-
return truthy;
7950-
}
7951-
}
7952-
79537939
function createLiteralType(flags: TypeFlags, value: string | number, symbol: Symbol) {
79547940
const type = <LiteralType>createType(flags);
79557941
type.symbol = symbol;

tests/baselines/reference/objectSpread.types

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ function from16326(this: { header: Header }, header: Header, authToken: string):
247247
>Header : Header
248248

249249
return {
250-
>{ ...this.header, ...header, ...authToken && { authToken } } : { authToken: string; head: string; body: string; }
250+
>{ ...this.header, ...header, ...authToken && { authToken } } : { head: string; body: string; authToken: string; } | { authToken: string; head: string; body: string; }
251251

252252
...this.header,
253253
>this.header : Header
@@ -280,9 +280,9 @@ function conditionalSpreadBoolean(b: boolean) : { x: number, y: number } {
280280
>13 : 13
281281

282282
o = {
283-
>o = { ...o, ...b && { x: 14 } } : { x: number; y: number; }
283+
>o = { ...o, ...b && { x: 14 } } : { x: number; y: number; } | { x: number; y: number; }
284284
>o : { x: number; y: number; }
285-
>{ ...o, ...b && { x: 14 } } : { x: number; y: number; }
285+
>{ ...o, ...b && { x: 14 } } : { x: number; y: number; } | { x: number; y: number; }
286286

287287
...o,
288288
>o : { x: number; y: number; }
@@ -295,8 +295,8 @@ function conditionalSpreadBoolean(b: boolean) : { x: number, y: number } {
295295
>14 : 14
296296
}
297297
let o2 = { ...b && { x: 21 }}
298-
>o2 : { x?: number | undefined; }
299-
>{ ...b && { x: 21 }} : { x?: number | undefined; }
298+
>o2 : {} | { x: number; }
299+
>{ ...b && { x: 21 }} : {} | { x: number; }
300300
>b && { x: 21 } : false | { x: number; }
301301
>b : boolean
302302
>{ x: 21 } : { x: number; }
@@ -321,9 +321,9 @@ function conditionalSpreadNumber(nt: number): { x: number, y: number } {
321321
>16 : 16
322322

323323
o = {
324-
>o = { ...o, ...nt && { x: nt } } : { x: number; y: number; }
324+
>o = { ...o, ...nt && { x: nt } } : { x: number; y: number; } | { x: number; y: number; }
325325
>o : { x: number; y: number; }
326-
>{ ...o, ...nt && { x: nt } } : { x: number; y: number; }
326+
>{ ...o, ...nt && { x: nt } } : { x: number; y: number; } | { x: number; y: number; }
327327

328328
...o,
329329
>o : { x: number; y: number; }
@@ -336,8 +336,8 @@ function conditionalSpreadNumber(nt: number): { x: number, y: number } {
336336
>nt : number
337337
}
338338
let o2 = { ...nt && { x: nt }}
339-
>o2 : { x?: number | undefined; }
340-
>{ ...nt && { x: nt }} : { x?: number | undefined; }
339+
>o2 : {} | { x: number; }
340+
>{ ...nt && { x: nt }} : {} | { x: number; }
341341
>nt && { x: nt } : 0 | { x: number; }
342342
>nt : number
343343
>{ x: nt } : { x: number; }
@@ -362,9 +362,9 @@ function conditionalSpreadString(st: string): { x: string, y: number } {
362362
>17 : 17
363363

364364
o = {
365-
>o = { ...o, ...st && { x: st } } : { x: string; y: number; }
365+
>o = { ...o, ...st && { x: st } } : { x: string; y: number; } | { x: string; y: number; }
366366
>o : { x: string; y: number; }
367-
>{ ...o, ...st && { x: st } } : { x: string; y: number; }
367+
>{ ...o, ...st && { x: st } } : { x: string; y: number; } | { x: string; y: number; }
368368

369369
...o,
370370
>o : { x: string; y: number; }
@@ -377,8 +377,8 @@ function conditionalSpreadString(st: string): { x: string, y: number } {
377377
>st : string
378378
}
379379
let o2 = { ...st && { x: st }}
380-
>o2 : { x?: string | undefined; }
381-
>{ ...st && { x: st }} : { x?: string | undefined; }
380+
>o2 : {} | { x: string; }
381+
>{ ...st && { x: st }} : {} | { x: string; }
382382
>st && { x: st } : "" | { x: string; }
383383
>st : string
384384
>{ x: st } : { x: string; }
@@ -571,8 +571,8 @@ let shortCutted: { a: number, b: string } = { ...o, a }
571571

572572
// non primitive
573573
let spreadNonPrimitive = { ...<object>{}};
574-
>spreadNonPrimitive : {}
575-
>{ ...<object>{}} : {}
574+
>spreadNonPrimitive : object
575+
>{ ...<object>{}} : object
576576
><object>{} : object
577577
>{} : {}
578578

tests/baselines/reference/objectSpreadNegative.errors.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ tests/cases/conformance/types/spread/objectSpreadNegative.ts(38,19): error TS269
1515
tests/cases/conformance/types/spread/objectSpreadNegative.ts(43,1): error TS2349: Cannot invoke an expression whose type lacks a call signature. Type '{}' has no compatible call signatures.
1616
tests/cases/conformance/types/spread/objectSpreadNegative.ts(47,12): error TS2339: Property 'b' does not exist on type '{}'.
1717
tests/cases/conformance/types/spread/objectSpreadNegative.ts(53,9): error TS2339: Property 'm' does not exist on type '{ p: number; }'.
18-
tests/cases/conformance/types/spread/objectSpreadNegative.ts(58,11): error TS2339: Property 'a' does not exist on type '{}'.
18+
tests/cases/conformance/types/spread/objectSpreadNegative.ts(58,11): error TS2339: Property 'a' does not exist on type 'object'.
1919
tests/cases/conformance/types/spread/objectSpreadNegative.ts(62,14): error TS2698: Spread types may only be created from object types.
2020
tests/cases/conformance/types/spread/objectSpreadNegative.ts(65,14): error TS2698: Spread types may only be created from object types.
2121
tests/cases/conformance/types/spread/objectSpreadNegative.ts(79,37): error TS2322: Type '{ a: string; b: string; extra: string; }' is not assignable to type 'A'.
@@ -117,7 +117,7 @@ tests/cases/conformance/types/spread/objectSpreadNegative.ts(84,7): error TS2322
117117
let spreadObj = { ...obj };
118118
spreadObj.a; // error 'a' is not in {}
119119
~
120-
!!! error TS2339: Property 'a' does not exist on type '{}'.
120+
!!! error TS2339: Property 'a' does not exist on type 'object'.
121121

122122
// generics
123123
function f<T, U>(t: T, u: U) {

tests/baselines/reference/spreadUnion2.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@
22
declare const undefinedUnion: { a: number } | undefined;
33
declare const nullUnion: { b: number } | null;
44

5-
var o1: { a?: number | undefined };
5+
var o1: {} | { a: number };
66
var o1 = { ...undefinedUnion };
77

8-
var o2: { b?: number | undefined };
8+
var o2: {} | { b: number };
99
var o2 = { ...nullUnion };
1010

11-
var o3: { a?: number | undefined, b?: number | undefined };
11+
var o3: {} | { a: number } | { b: number } | { a: number, b: number };
1212
var o3 = { ...undefinedUnion, ...nullUnion };
1313
var o3 = { ...nullUnion, ...undefinedUnion };
1414

15-
var o4: { a?: number | undefined };
15+
var o4: {} | { a: number };
1616
var o4 = { ...undefinedUnion, ...undefinedUnion };
1717

18-
var o5: { b?: number | undefined };
18+
var o5: {} | { b: number };
1919
var o5 = { ...nullUnion, ...nullUnion };
2020

2121

tests/baselines/reference/spreadUnion2.symbols

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,28 @@ declare const nullUnion: { b: number } | null;
77
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
88
>b : Symbol(b, Decl(spreadUnion2.ts, 1, 26))
99

10-
var o1: { a?: number | undefined };
10+
var o1: {} | { a: number };
1111
>o1 : Symbol(o1, Decl(spreadUnion2.ts, 3, 3), Decl(spreadUnion2.ts, 4, 3))
12-
>a : Symbol(a, Decl(spreadUnion2.ts, 3, 9))
12+
>a : Symbol(a, Decl(spreadUnion2.ts, 3, 14))
1313

1414
var o1 = { ...undefinedUnion };
1515
>o1 : Symbol(o1, Decl(spreadUnion2.ts, 3, 3), Decl(spreadUnion2.ts, 4, 3))
1616
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
1717

18-
var o2: { b?: number | undefined };
18+
var o2: {} | { b: number };
1919
>o2 : Symbol(o2, Decl(spreadUnion2.ts, 6, 3), Decl(spreadUnion2.ts, 7, 3))
20-
>b : Symbol(b, Decl(spreadUnion2.ts, 6, 9))
20+
>b : Symbol(b, Decl(spreadUnion2.ts, 6, 14))
2121

2222
var o2 = { ...nullUnion };
2323
>o2 : Symbol(o2, Decl(spreadUnion2.ts, 6, 3), Decl(spreadUnion2.ts, 7, 3))
2424
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
2525

26-
var o3: { a?: number | undefined, b?: number | undefined };
26+
var o3: {} | { a: number } | { b: number } | { a: number, b: number };
2727
>o3 : Symbol(o3, Decl(spreadUnion2.ts, 9, 3), Decl(spreadUnion2.ts, 10, 3), Decl(spreadUnion2.ts, 11, 3))
28-
>a : Symbol(a, Decl(spreadUnion2.ts, 9, 9))
29-
>b : Symbol(b, Decl(spreadUnion2.ts, 9, 33))
28+
>a : Symbol(a, Decl(spreadUnion2.ts, 9, 14))
29+
>b : Symbol(b, Decl(spreadUnion2.ts, 9, 30))
30+
>a : Symbol(a, Decl(spreadUnion2.ts, 9, 46))
31+
>b : Symbol(b, Decl(spreadUnion2.ts, 9, 57))
3032

3133
var o3 = { ...undefinedUnion, ...nullUnion };
3234
>o3 : Symbol(o3, Decl(spreadUnion2.ts, 9, 3), Decl(spreadUnion2.ts, 10, 3), Decl(spreadUnion2.ts, 11, 3))
@@ -38,18 +40,18 @@ var o3 = { ...nullUnion, ...undefinedUnion };
3840
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
3941
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
4042

41-
var o4: { a?: number | undefined };
43+
var o4: {} | { a: number };
4244
>o4 : Symbol(o4, Decl(spreadUnion2.ts, 13, 3), Decl(spreadUnion2.ts, 14, 3))
43-
>a : Symbol(a, Decl(spreadUnion2.ts, 13, 9))
45+
>a : Symbol(a, Decl(spreadUnion2.ts, 13, 14))
4446

4547
var o4 = { ...undefinedUnion, ...undefinedUnion };
4648
>o4 : Symbol(o4, Decl(spreadUnion2.ts, 13, 3), Decl(spreadUnion2.ts, 14, 3))
4749
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
4850
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
4951

50-
var o5: { b?: number | undefined };
52+
var o5: {} | { b: number };
5153
>o5 : Symbol(o5, Decl(spreadUnion2.ts, 16, 3), Decl(spreadUnion2.ts, 17, 3))
52-
>b : Symbol(b, Decl(spreadUnion2.ts, 16, 9))
54+
>b : Symbol(b, Decl(spreadUnion2.ts, 16, 14))
5355

5456
var o5 = { ...nullUnion, ...nullUnion };
5557
>o5 : Symbol(o5, Decl(spreadUnion2.ts, 16, 3), Decl(spreadUnion2.ts, 17, 3))

tests/baselines/reference/spreadUnion2.types

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,58 +8,60 @@ declare const nullUnion: { b: number } | null;
88
>b : number
99
>null : null
1010

11-
var o1: { a?: number | undefined };
12-
>o1 : { a?: number | undefined; }
13-
>a : number | undefined
11+
var o1: {} | { a: number };
12+
>o1 : {} | { a: number; }
13+
>a : number
1414

1515
var o1 = { ...undefinedUnion };
16-
>o1 : { a?: number | undefined; }
17-
>{ ...undefinedUnion } : { a?: number | undefined; }
16+
>o1 : {} | { a: number; }
17+
>{ ...undefinedUnion } : {} | { a: number; }
1818
>undefinedUnion : { a: number; } | undefined
1919

20-
var o2: { b?: number | undefined };
21-
>o2 : { b?: number | undefined; }
22-
>b : number | undefined
20+
var o2: {} | { b: number };
21+
>o2 : {} | { b: number; }
22+
>b : number
2323

2424
var o2 = { ...nullUnion };
25-
>o2 : { b?: number | undefined; }
26-
>{ ...nullUnion } : { b?: number | undefined; }
25+
>o2 : {} | { b: number; }
26+
>{ ...nullUnion } : {} | { b: number; }
2727
>nullUnion : { b: number; } | null
2828

29-
var o3: { a?: number | undefined, b?: number | undefined };
30-
>o3 : { a?: number | undefined; b?: number | undefined; }
31-
>a : number | undefined
32-
>b : number | undefined
29+
var o3: {} | { a: number } | { b: number } | { a: number, b: number };
30+
>o3 : {} | { a: number; } | { b: number; } | { a: number; b: number; }
31+
>a : number
32+
>b : number
33+
>a : number
34+
>b : number
3335

3436
var o3 = { ...undefinedUnion, ...nullUnion };
35-
>o3 : { a?: number | undefined; b?: number | undefined; }
36-
>{ ...undefinedUnion, ...nullUnion } : { b?: number | undefined; a?: number | undefined; }
37+
>o3 : {} | { a: number; } | { b: number; } | { a: number; b: number; }
38+
>{ ...undefinedUnion, ...nullUnion } : {} | { b: number; } | { a: number; } | { b: number; a: number; }
3739
>undefinedUnion : { a: number; } | undefined
3840
>nullUnion : { b: number; } | null
3941

4042
var o3 = { ...nullUnion, ...undefinedUnion };
41-
>o3 : { a?: number | undefined; b?: number | undefined; }
42-
>{ ...nullUnion, ...undefinedUnion } : { a?: number | undefined; b?: number | undefined; }
43+
>o3 : {} | { a: number; } | { b: number; } | { a: number; b: number; }
44+
>{ ...nullUnion, ...undefinedUnion } : {} | { a: number; } | { b: number; } | { a: number; b: number; }
4345
>nullUnion : { b: number; } | null
4446
>undefinedUnion : { a: number; } | undefined
4547

46-
var o4: { a?: number | undefined };
47-
>o4 : { a?: number | undefined; }
48-
>a : number | undefined
48+
var o4: {} | { a: number };
49+
>o4 : {} | { a: number; }
50+
>a : number
4951

5052
var o4 = { ...undefinedUnion, ...undefinedUnion };
51-
>o4 : { a?: number | undefined; }
52-
>{ ...undefinedUnion, ...undefinedUnion } : { a?: number | undefined; }
53+
>o4 : {} | { a: number; }
54+
>{ ...undefinedUnion, ...undefinedUnion } : {} | { a: number; } | { a: number; } | { a: number; }
5355
>undefinedUnion : { a: number; } | undefined
5456
>undefinedUnion : { a: number; } | undefined
5557

56-
var o5: { b?: number | undefined };
57-
>o5 : { b?: number | undefined; }
58-
>b : number | undefined
58+
var o5: {} | { b: number };
59+
>o5 : {} | { b: number; }
60+
>b : number
5961

6062
var o5 = { ...nullUnion, ...nullUnion };
61-
>o5 : { b?: number | undefined; }
62-
>{ ...nullUnion, ...nullUnion } : { b?: number | undefined; }
63+
>o5 : {} | { b: number; }
64+
>{ ...nullUnion, ...nullUnion } : {} | { b: number; } | { b: number; } | { b: number; }
6365
>nullUnion : { b: number; } | null
6466
>nullUnion : { b: number; } | null
6567

0 commit comments

Comments
 (0)