@@ -7121,6 +7121,7 @@ namespace ts {
7121
7121
let type: Type | undefined;
7122
7122
if (pattern.kind === SyntaxKind.ObjectBindingPattern) {
7123
7123
if (declaration.dotDotDotToken) {
7124
+ parentType = eraseNeverLikeTypes(parentType);
7124
7125
if (parentType.flags & TypeFlags.Unknown || !isValidSpreadType(parentType)) {
7125
7126
error(declaration, Diagnostics.Rest_types_may_only_be_created_from_object_types);
7126
7127
return errorType;
@@ -10250,22 +10251,30 @@ namespace ts {
10250
10251
return property && !(getCheckFlags(property) & CheckFlags.ReadPartial) ? property : undefined;
10251
10252
}
10252
10253
10253
- function isNeverLikeIntersection(type: IntersectionType) {
10254
- if (!(type.objectFlags & ObjectFlags.IsNeverIntersectionComputed)) {
10255
- type.objectFlags |= ObjectFlags.IsNeverIntersectionComputed |
10256
- (some(getPropertiesOfUnionOrIntersectionType(type), isDiscriminantWithNeverType) ? ObjectFlags.IsNeverIntersection : 0);
10254
+ function eraseNeverLikeTypes(type: Type) {
10255
+ return mapType(type, t => isNeverLikeType(t) ? neverType : t);
10256
+ }
10257
+
10258
+ function isNeverLikeType(type: Type) {
10259
+ if (type.flags & TypeFlags.Never) {
10260
+ return true;
10261
+ }
10262
+ if (type.flags & TypeFlags.UnionOrIntersection) {
10263
+ if (!((<UnionOrIntersectionType>type).objectFlags & ObjectFlags.IsNeverTypeComputed)) {
10264
+ const isNeverLike = type.flags & TypeFlags.Union ?
10265
+ !((<UnionType>type).objectFlags & ObjectFlags.PrimitiveUnion) && every((<UnionType>type).types, isNeverLikeType) :
10266
+ some(getPropertiesOfUnionOrIntersectionType(<IntersectionType>type), isDiscriminantWithNeverType);
10267
+ (<UnionOrIntersectionType>type).objectFlags |= ObjectFlags.IsNeverTypeComputed | (isNeverLike ? ObjectFlags.IsNeverType : 0);
10268
+ }
10269
+ return !!((<UnionOrIntersectionType>type).objectFlags & ObjectFlags.IsNeverType);
10257
10270
}
10258
- return !!(type.objectFlags & ObjectFlags.IsNeverIntersection) ;
10271
+ return false ;
10259
10272
}
10260
10273
10261
10274
function isDiscriminantWithNeverType(prop: Symbol) {
10262
10275
return (getCheckFlags(prop) & (CheckFlags.Discriminant | CheckFlags.HasNeverType)) === CheckFlags.Discriminant && !!(getTypeOfSymbol(prop).flags & TypeFlags.Never);
10263
10276
}
10264
10277
10265
- function isNeverLikeType(type: Type) {
10266
- return !!(type.flags & TypeFlags.Never || type.flags & TypeFlags.Intersection && isNeverLikeIntersection(<IntersectionType>type));
10267
- }
10268
-
10269
10278
/**
10270
10279
* Return the symbol for the property with the given name in the given type. Creates synthetic union properties when
10271
10280
* necessary, maps primitive types and type parameters are to their apparent types, and augments with properties from
@@ -10294,7 +10303,7 @@ namespace ts {
10294
10303
}
10295
10304
return getPropertyOfObjectType(globalObjectType, name);
10296
10305
}
10297
- if (type.flags & TypeFlags.Union || type.flags & TypeFlags.Intersection && !isNeverLikeIntersection(<IntersectionType> type)) {
10306
+ if (type.flags & TypeFlags.UnionOrIntersection && !isNeverLikeType( type)) {
10298
10307
return getPropertyOfUnionOrIntersectionType(<UnionOrIntersectionType>type, name);
10299
10308
}
10300
10309
return undefined;
@@ -12270,13 +12279,13 @@ namespace ts {
12270
12279
}
12271
12280
12272
12281
function getIndexType(type: Type, stringsOnly = keyofStringsOnly, noIndexSignatures?: boolean): Type {
12273
- return type.flags & TypeFlags.Union ? getIntersectionType(map((<IntersectionType>type).types, t => getIndexType(t, stringsOnly, noIndexSignatures))) :
12282
+ return type.flags & TypeFlags.Any || isNeverLikeType(type) ? keyofConstraintType :
12283
+ type.flags & TypeFlags.Union ? getIntersectionType(map((<IntersectionType>type).types, t => getIndexType(t, stringsOnly, noIndexSignatures))) :
12274
12284
type.flags & TypeFlags.Intersection ? getUnionType(map((<IntersectionType>type).types, t => getIndexType(t, stringsOnly, noIndexSignatures))) :
12275
12285
maybeTypeOfKind(type, TypeFlags.InstantiableNonPrimitive) ? getIndexTypeForGenericType(<InstantiableType | UnionOrIntersectionType>type, stringsOnly) :
12276
12286
getObjectFlags(type) & ObjectFlags.Mapped ? filterType(getConstraintTypeFromMappedType(<MappedType>type), t => !(noIndexSignatures && t.flags & (TypeFlags.Any | TypeFlags.String))) :
12277
12287
type === wildcardType ? wildcardType :
12278
12288
type.flags & TypeFlags.Unknown ? neverType :
12279
- type.flags & (TypeFlags.Any | TypeFlags.Never) ? keyofConstraintType :
12280
12289
stringsOnly ? !noIndexSignatures && getIndexInfoOfType(type, IndexKind.String) ? stringType : getLiteralTypeFromProperties(type, TypeFlags.StringLiteral) :
12281
12290
!noIndexSignatures && getIndexInfoOfType(type, IndexKind.String) ? getUnionType([stringType, numberType, getLiteralTypeFromProperties(type, TypeFlags.UniqueESSymbol)]) :
12282
12291
getNonEnumNumberIndexInfo(type) ? getUnionType([numberType, getLiteralTypeFromProperties(type, TypeFlags.StringLiteral | TypeFlags.UniqueESSymbol)]) :
@@ -13077,6 +13086,7 @@ namespace ts {
13077
13086
if (right.flags & TypeFlags.Union) {
13078
13087
const merged = tryMergeUnionOfObjectTypeAndEmptyObject(right as UnionType, readonly);
13079
13088
if (merged) {
13089
+
13080
13090
return getSpreadType(left, merged, symbol, objectFlags, readonly);
13081
13091
}
13082
13092
return mapType(right, t => getSpreadType(left, t, symbol, objectFlags, readonly));
@@ -13663,6 +13673,9 @@ namespace ts {
13663
13673
const mappedTypeVariable = instantiateType(typeVariable, mapper);
13664
13674
if (typeVariable !== mappedTypeVariable) {
13665
13675
return mapType(mappedTypeVariable, t => {
13676
+ if (isNeverLikeType(t)) {
13677
+ return neverType;
13678
+ }
13666
13679
if (t.flags & (TypeFlags.AnyOrUnknown | TypeFlags.InstantiableNonPrimitive | TypeFlags.Object | TypeFlags.Intersection) && t !== wildcardType && t !== errorType) {
13667
13680
const replacementMapper = createReplacementMapper(typeVariable, t, mapper);
13668
13681
return isArrayType(t) ? instantiateMappedArrayType(t, type, replacementMapper) :
@@ -14812,7 +14825,7 @@ namespace ts {
14812
14825
function getNormalizedType(type: Type, writing: boolean): Type {
14813
14826
return isFreshLiteralType(type) ? (<FreshableType>type).regularType :
14814
14827
getObjectFlags(type) & ObjectFlags.Reference && (<TypeReference>type).node ? createTypeReference((<TypeReference>type).target, getTypeArguments(<TypeReference>type)) :
14815
- type.flags & TypeFlags.Intersection && isNeverLikeIntersection(<IntersectionType> type) ? neverType :
14828
+ type.flags & TypeFlags.UnionOrIntersection && isNeverLikeType( type) ? neverType :
14816
14829
type.flags & TypeFlags.Substitution ? writing ? (<SubstitutionType>type).typeVariable : (<SubstitutionType>type).substitute :
14817
14830
type.flags & TypeFlags.Simplifiable ? getSimplifiedType(type, writing) :
14818
14831
type;
@@ -22511,7 +22524,7 @@ namespace ts {
22511
22524
hasComputedStringProperty = false;
22512
22525
hasComputedNumberProperty = false;
22513
22526
}
22514
- const type = checkExpression(memberDecl.expression);
22527
+ const type = eraseNeverLikeTypes( checkExpression(memberDecl.expression) );
22515
22528
if (!isValidSpreadType(type)) {
22516
22529
error(memberDecl, Diagnostics.Spread_types_may_only_be_created_from_object_types);
22517
22530
return errorType;
@@ -22716,7 +22729,7 @@ namespace ts {
22716
22729
spread = getSpreadType(spread, createJsxAttributesType(), attributes.symbol, objectFlags, /*readonly*/ false);
22717
22730
attributesTable = createSymbolTable();
22718
22731
}
22719
- const exprType = checkExpressionCached(attributeDecl.expression, checkMode);
22732
+ const exprType = eraseNeverLikeTypes( checkExpressionCached(attributeDecl.expression, checkMode) );
22720
22733
if (isTypeAny(exprType)) {
22721
22734
hasSpreadAnyType = true;
22722
22735
}
0 commit comments