@@ -5481,7 +5481,7 @@ namespace ts {
5481
5481
function getTypeFromObjectBindingPattern(pattern: ObjectBindingPattern, includePatternInType: boolean, reportErrors: boolean): Type {
5482
5482
const members = createSymbolTable();
5483
5483
let stringIndexInfo: IndexInfo | undefined;
5484
- let objectFlags = ObjectFlags.ObjectLiteral | ObjectFlags.ContainsObjectLiteral ;
5484
+ let objectFlags = ObjectFlags.ObjectLiteral | ObjectFlags.ContainsObjectOrArrayLiteral ;
5485
5485
forEach(pattern.elements, e => {
5486
5486
const name = e.propertyName || <Identifier>e.name;
5487
5487
if (e.dotDotDotToken) {
@@ -10803,7 +10803,7 @@ namespace ts {
10803
10803
emptyArray,
10804
10804
getIndexInfoWithReadonly(stringIndexInfo, readonly),
10805
10805
getIndexInfoWithReadonly(numberIndexInfo, readonly));
10806
- spread.objectFlags |= ObjectFlags.ObjectLiteral | ObjectFlags.ContainsObjectLiteral | ObjectFlags.ContainsSpread | objectFlags;
10806
+ spread.objectFlags |= ObjectFlags.ObjectLiteral | ObjectFlags.ContainsObjectOrArrayLiteral | ObjectFlags.ContainsSpread | objectFlags;
10807
10807
return spread;
10808
10808
}
10809
10809
@@ -15644,12 +15644,16 @@ namespace ts {
15644
15644
return !!(getObjectFlags(type) & ObjectFlags.ObjectLiteral);
15645
15645
}
15646
15646
15647
- function widenObjectLiteralCandidates(candidates: Type[]): Type[] {
15647
+ function isObjectOrArrayLiteralType(type: Type) {
15648
+ return !!(getObjectFlags(type) & (ObjectFlags.ObjectLiteral | ObjectFlags.ArrayLiteral));
15649
+ }
15650
+
15651
+ function unionObjectAndArrayLiteralCandidates(candidates: Type[]): Type[] {
15648
15652
if (candidates.length > 1) {
15649
- const objectLiterals = filter(candidates, isObjectLiteralType );
15653
+ const objectLiterals = filter(candidates, isObjectOrArrayLiteralType );
15650
15654
if (objectLiterals.length) {
15651
- const objectLiteralsType = getWidenedType( getUnionType(objectLiterals, UnionReduction.Subtype) );
15652
- return concatenate(filter(candidates, t => !isObjectLiteralType (t)), [objectLiteralsType ]);
15655
+ const literalsType = getUnionType(objectLiterals, UnionReduction.Subtype);
15656
+ return concatenate(filter(candidates, t => !isObjectOrArrayLiteralType (t)), [literalsType ]);
15653
15657
}
15654
15658
}
15655
15659
return candidates;
@@ -15660,8 +15664,8 @@ namespace ts {
15660
15664
}
15661
15665
15662
15666
function getCovariantInference(inference: InferenceInfo, signature: Signature) {
15663
- // Extract all object literal types and replace them with a single widened and normalized type.
15664
- const candidates = widenObjectLiteralCandidates (inference.candidates!);
15667
+ // Extract all object and array literal types and replace them with a single widened and normalized type.
15668
+ const candidates = unionObjectAndArrayLiteralCandidates (inference.candidates!);
15665
15669
// We widen inferred literal types if
15666
15670
// all inferences were made to top-level occurrences of the type parameter, and
15667
15671
// the type parameter has no constraint or its constraint includes no primitive or literal types, and
@@ -19147,22 +19151,34 @@ namespace ts {
19147
19151
const minLength = elementCount - (hasRestElement ? 1 : 0);
19148
19152
// If array literal is actually a destructuring pattern, mark it as an implied type. We do this such
19149
19153
// that we get the same behavior for "var [x, y] = []" and "[x, y] = []".
19150
- let tupleResult: Type | undefined ;
19154
+ let tupleResult;
19151
19155
if (inDestructuringPattern && minLength > 0) {
19152
19156
const type = cloneTypeReference(<TypeReference>createTupleType(elementTypes, minLength, hasRestElement));
19153
19157
type.pattern = node;
19154
19158
return type;
19155
19159
}
19156
19160
else if (tupleResult = getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasRestElement, elementCount, inConstContext)) {
19157
- return tupleResult;
19161
+ return createArrayLiteralType( tupleResult) ;
19158
19162
}
19159
19163
else if (forceTuple) {
19160
- return createTupleType(elementTypes, minLength, hasRestElement);
19164
+ return createArrayLiteralType( createTupleType(elementTypes, minLength, hasRestElement) );
19161
19165
}
19162
19166
}
19163
- return createArrayType(elementTypes.length ?
19167
+ return createArrayLiteralType( createArrayType(elementTypes.length ?
19164
19168
getUnionType(elementTypes, UnionReduction.Subtype) :
19165
- strictNullChecks ? implicitNeverType : undefinedWideningType, inConstContext);
19169
+ strictNullChecks ? implicitNeverType : undefinedWideningType, inConstContext));
19170
+ }
19171
+
19172
+ function createArrayLiteralType(type: ObjectType) {
19173
+ if (!(getObjectFlags(type) & ObjectFlags.Reference)) {
19174
+ return type;
19175
+ }
19176
+ let literalType = (<TypeReference>type).literalType;
19177
+ if (!literalType) {
19178
+ literalType = (<TypeReference>type).literalType = cloneTypeReference(<TypeReference>type);
19179
+ literalType.objectFlags |= ObjectFlags.ArrayLiteral | ObjectFlags.ContainsObjectOrArrayLiteral;
19180
+ }
19181
+ return literalType;
19166
19182
}
19167
19183
19168
19184
function getArrayLiteralTupleTypeIfApplicable(elementTypes: Type[], contextualType: Type | undefined, hasRestElement: boolean, elementCount = elementTypes.length, readonly = false) {
@@ -19447,7 +19463,7 @@ namespace ts {
19447
19463
const stringIndexInfo = hasComputedStringProperty ? getObjectLiteralIndexInfo(node, offset, propertiesArray, IndexKind.String) : undefined;
19448
19464
const numberIndexInfo = hasComputedNumberProperty ? getObjectLiteralIndexInfo(node, offset, propertiesArray, IndexKind.Number) : undefined;
19449
19465
const result = createAnonymousType(node.symbol, propertiesTable, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
19450
- result.objectFlags |= objectFlags | ObjectFlags.ObjectLiteral | ObjectFlags.ContainsObjectLiteral ;
19466
+ result.objectFlags |= objectFlags | ObjectFlags.ObjectLiteral | ObjectFlags.ContainsObjectOrArrayLiteral ;
19451
19467
if (isJSObjectLiteral) {
19452
19468
result.objectFlags |= ObjectFlags.JSLiteral;
19453
19469
}
@@ -19643,7 +19659,7 @@ namespace ts {
19643
19659
function createJsxAttributesType() {
19644
19660
objectFlags |= freshObjectLiteralFlag;
19645
19661
const result = createAnonymousType(attributes.symbol, attributesTable, emptyArray, emptyArray, /*stringIndexInfo*/ undefined, /*numberIndexInfo*/ undefined);
19646
- result.objectFlags |= objectFlags | ObjectFlags.ObjectLiteral | ObjectFlags.ContainsObjectLiteral ;
19662
+ result.objectFlags |= objectFlags | ObjectFlags.ObjectLiteral | ObjectFlags.ContainsObjectOrArrayLiteral ;
19647
19663
return result;
19648
19664
}
19649
19665
}
0 commit comments