Skip to content

Commit 4bf8ac2

Browse files
authoredOct 12, 2020
Merge pull request #40778 from weswigham/spread-compact-literals
Always create optional properties when spreading objects conditionally
2 parents a09a714 + e46a038 commit 4bf8ac2

File tree

4 files changed

+6
-182
lines changed

4 files changed

+6
-182
lines changed
 

‎src/compiler/checker.ts

+2-8
Original file line numberDiff line numberDiff line change
@@ -14436,23 +14436,17 @@ namespace ts {
1443614436
return isEmptyObjectType(type) || !!(type.flags & (TypeFlags.Null | TypeFlags.Undefined | TypeFlags.BooleanLike | TypeFlags.NumberLike | TypeFlags.BigIntLike | TypeFlags.StringLike | TypeFlags.EnumLike | TypeFlags.NonPrimitive | TypeFlags.Index));
1443714437
}
1443814438

14439-
function isSinglePropertyAnonymousObjectType(type: Type) {
14440-
return !!(type.flags & TypeFlags.Object) &&
14441-
!!(getObjectFlags(type) & ObjectFlags.Anonymous) &&
14442-
(length(getPropertiesOfType(type)) === 1 || every(getPropertiesOfType(type), p => !!(p.flags & SymbolFlags.Optional)));
14443-
}
14444-
1444514439
function tryMergeUnionOfObjectTypeAndEmptyObject(type: UnionType, readonly: boolean): Type | undefined {
1444614440
if (type.types.length === 2) {
1444714441
const firstType = type.types[0];
1444814442
const secondType = type.types[1];
1444914443
if (every(type.types, isEmptyObjectTypeOrSpreadsIntoEmptyObject)) {
1445014444
return isEmptyObjectType(firstType) ? firstType : isEmptyObjectType(secondType) ? secondType : emptyObjectType;
1445114445
}
14452-
if (isEmptyObjectTypeOrSpreadsIntoEmptyObject(firstType) && isSinglePropertyAnonymousObjectType(secondType)) {
14446+
if (isEmptyObjectTypeOrSpreadsIntoEmptyObject(firstType)) {
1445314447
return getAnonymousPartialType(secondType);
1445414448
}
14455-
if (isEmptyObjectTypeOrSpreadsIntoEmptyObject(secondType) && isSinglePropertyAnonymousObjectType(firstType)) {
14449+
if (isEmptyObjectTypeOrSpreadsIntoEmptyObject(secondType)) {
1445614450
return getAnonymousPartialType(firstType);
1445714451
}
1445814452
}

‎tests/baselines/reference/objectSpreadRepeatedComplexity.errors.txt

-170
This file was deleted.

‎tests/baselines/reference/objectSpreadRepeatedComplexity.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
=== tests/cases/conformance/types/spread/objectSpreadRepeatedComplexity.ts ===
22
function f(cnd: Record<number, boolean>){
3-
>f : (cnd: Record<number, boolean>) => any
3+
>f : (cnd: Record<number, boolean>) => { prop20a?: number; prop20b?: number; prop19a?: number; prop19b?: number; prop18a?: number; prop18b?: number; prop17a?: number; prop17b?: number; prop16a?: number; prop16b?: number; prop15a?: number; prop15b?: number; prop14a?: number; prop14b?: number; prop13a?: number; prop13b?: number; prop12a?: number; prop12b?: number; prop11a?: number; prop11b?: number; prop10a?: number; prop10b?: number; prop9a?: number; prop9b?: number; prop8a?: number; prop8b?: number; prop7a?: number; prop7b?: number; prop6a?: number; prop6b?: number; prop5a?: number; prop5b?: number; prop4a?: number; prop4b?: number; prop3a?: number; prop3b?: number; prop0?: number; }
44
>cnd : Record<number, boolean>
55

66
// Type is a union of 2^(n-1) members, where n is the number of spread objects
77
return {
8-
>{ // Without this one, it collapses to {} ? ...(cnd[1] && cnd[2] && { prop0: 0, }), // With one prop each, it collapses to a single object (#34853?) ...(cnd[3] && { prop3a: 1, prop3b: 1, }), ...(cnd[4] && { prop4a: 1, prop4b: 1, }), ...(cnd[5] && { prop5a: 1, prop5b: 1, }), ...(cnd[6] && { prop6a: 1, prop6b: 1, }), ...(cnd[7] && { prop7a: 1, prop7b: 1, }), ...(cnd[8] && { prop8a: 1, prop8b: 1, }), ...(cnd[9] && { prop9a: 1, prop9b: 1, }), ...(cnd[10] && { prop10a: 1, prop10b: 1, }), ...(cnd[11] && { prop11a: 1, prop11b: 1, }), ...(cnd[12] && { prop12a: 1, prop12b: 1, }), ...(cnd[13] && { prop13a: 1, prop13b: 1, }), ...(cnd[14] && { prop14a: 1, prop14b: 1, }), ...(cnd[15] && { prop15a: 1, prop15b: 1, }), ...(cnd[16] && { prop16a: 1, prop16b: 1, }), ...(cnd[17] && { prop17a: 1, prop17b: 1, }), ...(cnd[18] && { prop18a: 1, prop18b: 1, }), ...(cnd[19] && { prop19a: 1, prop19b: 1, }), ...(cnd[20] && { prop20a: 1, prop20b: 1, }), } : any
8+
>{ // Without this one, it collapses to {} ? ...(cnd[1] && cnd[2] && { prop0: 0, }), // With one prop each, it collapses to a single object (#34853?) ...(cnd[3] && { prop3a: 1, prop3b: 1, }), ...(cnd[4] && { prop4a: 1, prop4b: 1, }), ...(cnd[5] && { prop5a: 1, prop5b: 1, }), ...(cnd[6] && { prop6a: 1, prop6b: 1, }), ...(cnd[7] && { prop7a: 1, prop7b: 1, }), ...(cnd[8] && { prop8a: 1, prop8b: 1, }), ...(cnd[9] && { prop9a: 1, prop9b: 1, }), ...(cnd[10] && { prop10a: 1, prop10b: 1, }), ...(cnd[11] && { prop11a: 1, prop11b: 1, }), ...(cnd[12] && { prop12a: 1, prop12b: 1, }), ...(cnd[13] && { prop13a: 1, prop13b: 1, }), ...(cnd[14] && { prop14a: 1, prop14b: 1, }), ...(cnd[15] && { prop15a: 1, prop15b: 1, }), ...(cnd[16] && { prop16a: 1, prop16b: 1, }), ...(cnd[17] && { prop17a: 1, prop17b: 1, }), ...(cnd[18] && { prop18a: 1, prop18b: 1, }), ...(cnd[19] && { prop19a: 1, prop19b: 1, }), ...(cnd[20] && { prop20a: 1, prop20b: 1, }), } : { prop20a?: number; prop20b?: number; prop19a?: number; prop19b?: number; prop18a?: number; prop18b?: number; prop17a?: number; prop17b?: number; prop16a?: number; prop16b?: number; prop15a?: number; prop15b?: number; prop14a?: number; prop14b?: number; prop13a?: number; prop13b?: number; prop12a?: number; prop12b?: number; prop11a?: number; prop11b?: number; prop10a?: number; prop10b?: number; prop9a?: number; prop9b?: number; prop8a?: number; prop8b?: number; prop7a?: number; prop7b?: number; prop6a?: number; prop6b?: number; prop5a?: number; prop5b?: number; prop4a?: number; prop4b?: number; prop3a?: number; prop3b?: number; prop0?: number; }
99

1010
// Without this one, it collapses to {} ?
1111
...(cnd[1] &&

‎tests/baselines/reference/spreadOverwritesPropertyStrict.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,14 @@ function h(obj: { x: number } | { x: string }) {
7878
>obj : { x: number; } | { x: string; }
7979
}
8080
function i(b: boolean, t: { command: string, ok: string }) {
81-
>i : (b: boolean, t: { command: string; ok: string;}) => { command: string; ok: string; } | { command: string; }
81+
>i : (b: boolean, t: { command: string; ok: string;}) => { command: string; ok?: string; }
8282
>b : boolean
8383
>t : { command: string; ok: string; }
8484
>command : string
8585
>ok : string
8686

8787
return { command: "hi", ...(b ? t : {}) } // ok
88-
>{ command: "hi", ...(b ? t : {}) } : { command: string; ok: string; } | { command: string; }
88+
>{ command: "hi", ...(b ? t : {}) } : { command: string; ok?: string; }
8989
>command : string
9090
>"hi" : "hi"
9191
>(b ? t : {}) : { command: string; ok: string; } | {}

0 commit comments

Comments
 (0)
Please sign in to comment.