Merge pull request #18451 from Microsoft/allow-booleans-in-spreads

Allow `falsy | T` spreads for falsy primitives
This commit is contained in:
Nathan Shively-Sanders
2017-09-15 16:24:16 -07:00
committed by GitHub
28 changed files with 787 additions and 428 deletions

View File

@@ -7862,7 +7862,10 @@ namespace ts {
return mapType(right, t => getSpreadType(left, t));
}
if (right.flags & TypeFlags.NonPrimitive) {
return emptyObjectType;
return nonPrimitiveType;
}
if (right.flags & (TypeFlags.BooleanLike | TypeFlags.NumberLike | TypeFlags.StringLike | TypeFlags.EnumLike)) {
return left;
}
const members = createSymbolTable();
@@ -7889,6 +7892,7 @@ namespace ts {
members.set(rightProp.escapedName, getNonReadonlySymbol(rightProp));
}
}
for (const leftProp of getPropertiesOfType(left)) {
if (leftProp.flags & SymbolFlags.SetAccessor && !(leftProp.flags & SymbolFlags.GetAccessor)
|| skippedPrivateMembers.has(leftProp.escapedName)
@@ -13784,7 +13788,8 @@ namespace ts {
}
function isValidSpreadType(type: Type): boolean {
return !!(type.flags & (TypeFlags.Any | TypeFlags.Null | TypeFlags.Undefined | TypeFlags.NonPrimitive) ||
return !!(type.flags & (TypeFlags.Any | TypeFlags.NonPrimitive) ||
getFalsyFlags(type) & TypeFlags.DefinitelyFalsy && isValidSpreadType(removeDefinitelyFalsyTypes(type)) ||
type.flags & TypeFlags.Object && !isGenericMappedType(type) ||
type.flags & TypeFlags.UnionOrIntersection && !forEach((<UnionOrIntersectionType>type).types, t => !isValidSpreadType(t)));
}