Skip to content

Commit 2152683

Browse files
committed
Simplify logic
1 parent 2178d55 commit 2152683

File tree

1 file changed

+16
-30
lines changed

1 file changed

+16
-30
lines changed

src/compiler/checker.ts

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3054,11 +3054,13 @@ namespace ts {
30543054
}
30553055

30563056
function getRestType(source: Type, properties: PropertyName[], symbol: Symbol): Type {
3057+
source = filterType(source, t => !(t.flags & TypeFlags.Nullable));
3058+
if (source.flags & TypeFlags.Never) {
3059+
return emptyObjectType;
3060+
}
3061+
30573062
if (source.flags & TypeFlags.Union) {
3058-
const types = filterNulableTypes(<UnionType>source);
3059-
if (types.length) {
3060-
return getUnionType(map(types, t => getRestType(t, properties, symbol)));
3061-
}
3063+
return mapType(source, t => getRestType(t, properties, symbol));
30623064
}
30633065

30643066
const members = createMap<Symbol>();
@@ -6103,10 +6105,6 @@ namespace ts {
61036105
return symbol ? getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol) : undefined;
61046106
}
61056107

6106-
function filterNulableTypes(union: UnionType): Type[] {
6107-
return filter(union.types, t => !(t.flags & TypeFlags.Nullable));
6108-
}
6109-
61106108
/**
61116109
* Since the source of spread types are object literals, which are not binary,
61126110
* this function should be called in a left folding style, with left = previous result of getSpreadType
@@ -6116,31 +6114,19 @@ namespace ts {
61166114
if (left.flags & TypeFlags.Any || right.flags & TypeFlags.Any) {
61176115
return anyType;
61186116
}
6119-
6120-
if (left.flags & TypeFlags.Union) {
6121-
const types = filterNulableTypes(<UnionType>left);
6122-
if (types.length) {
6123-
return getUnionType(map(types, t => getSpreadType(t, right, isFromObjectLiteral)));
6124-
}
6125-
else {
6126-
left = emptyObjectType;
6127-
}
6117+
left = filterType(left, t => !(t.flags & TypeFlags.Nullable));
6118+
if (left.flags & TypeFlags.Never) {
6119+
return right;
61286120
}
6129-
else if (left.flags & TypeFlags.Nullable) {
6130-
left = emptyObjectType;
6121+
right = filterType(right, t => !(t.flags & TypeFlags.Nullable));
6122+
if (right.flags & TypeFlags.Never) {
6123+
return left;
61316124
}
6132-
6133-
if (right.flags & TypeFlags.Union) {
6134-
const types = filterNulableTypes(<UnionType>right);
6135-
if (types.length) {
6136-
return getUnionType(map(types, t => getSpreadType(left, t, isFromObjectLiteral)));
6137-
}
6138-
else {
6139-
right = emptyObjectType;
6140-
}
6125+
if (left.flags & TypeFlags.Union) {
6126+
return mapType(left, t => getSpreadType(t, right, isFromObjectLiteral));
61416127
}
6142-
else if (right.flags & TypeFlags.Nullable) {
6143-
right = emptyObjectType;
6128+
if (right.flags & TypeFlags.Union) {
6129+
return mapType(right, t => getSpreadType(left, t, isFromObjectLiteral));
61446130
}
61456131

61466132
const members = createMap<Symbol>();

0 commit comments

Comments
 (0)