@@ -3054,11 +3054,13 @@ namespace ts {
3054
3054
}
3055
3055
3056
3056
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
+
3057
3062
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));
3062
3064
}
3063
3065
3064
3066
const members = createMap<Symbol>();
@@ -6103,10 +6105,6 @@ namespace ts {
6103
6105
return symbol ? getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol) : undefined;
6104
6106
}
6105
6107
6106
- function filterNulableTypes(union: UnionType): Type[] {
6107
- return filter(union.types, t => !(t.flags & TypeFlags.Nullable));
6108
- }
6109
-
6110
6108
/**
6111
6109
* Since the source of spread types are object literals, which are not binary,
6112
6110
* this function should be called in a left folding style, with left = previous result of getSpreadType
@@ -6116,31 +6114,19 @@ namespace ts {
6116
6114
if (left.flags & TypeFlags.Any || right.flags & TypeFlags.Any) {
6117
6115
return anyType;
6118
6116
}
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;
6128
6120
}
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;
6131
6124
}
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));
6141
6127
}
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)) ;
6144
6130
}
6145
6131
6146
6132
const members = createMap<Symbol>();
0 commit comments