@@ -12361,7 +12361,7 @@ namespace ts {
12361
12361
ElementFlags.Required;
12362
12362
default:
12363
12363
return ElementFlags.Required;
12364
- }
12364
+ }
12365
12365
}
12366
12366
12367
12367
function getRestTypeElementFlags(node: RestTypeNode | NamedTupleMember) {
@@ -12522,7 +12522,7 @@ namespace ts {
12522
12522
lengthSymbol.type = numberType;
12523
12523
}
12524
12524
else {
12525
- const literalTypes = [];
12525
+ const literalTypes = [];
12526
12526
for (let i = minLength; i <= arity; i++) literalTypes.push(getLiteralType(i));
12527
12527
lengthSymbol.type = getUnionType(literalTypes);
12528
12528
}
@@ -12557,7 +12557,7 @@ namespace ts {
12557
12557
return target.objectFlags & ObjectFlags.Tuple && (<TupleType>target).combinedFlags & ElementFlags.Variadic ?
12558
12558
createNormalizedTupleType(target as TupleType, typeArguments!) :
12559
12559
createTypeReference(target, typeArguments);
12560
- }
12560
+ }
12561
12561
12562
12562
function createNormalizedTupleType(target: TupleType, elementTypes: readonly Type[]): Type {
12563
12563
// Transform [A, ...(X | Y | Z)] into [A, ...X] | [A, ...Y] | [A, ...Z]
@@ -12569,7 +12569,7 @@ namespace ts {
12569
12569
const spreadIndex = findIndex(elementTypes, (t, i) => !!(target.elementFlags[i] & ElementFlags.Variadic) && !(t.flags & TypeFlags.InstantiableNonPrimitive) && !isGenericMappedType(t));
12570
12570
if (spreadIndex < 0) {
12571
12571
return createTypeReference(target, elementTypes);
12572
- }
12572
+ }
12573
12573
// We have non-generic variadic elements that need normalization.
12574
12574
const expandedTypes: Type[] = [];
12575
12575
const expandedFlags: ElementFlags[] = [];
@@ -12611,13 +12611,13 @@ namespace ts {
12611
12611
if (restTypes) {
12612
12612
// A rest element was previously added, so simply collect the type of this element.
12613
12613
restTypes.push(flags & ElementFlags.Variadic ? getIndexedAccessType(type, numberType) : type);
12614
- }
12614
+ }
12615
12615
else {
12616
12616
if (flags & ElementFlags.Required && optionalIndex >= 0) {
12617
12617
// Turn preceding optional elements into required elements
12618
12618
for (let i = optionalIndex; i < expandedFlags.length; i++) {
12619
12619
if (expandedFlags[i] & ElementFlags.Optional) expandedFlags[i] = ElementFlags.Required;
12620
- }
12620
+ }
12621
12621
optionalIndex = -1;
12622
12622
}
12623
12623
else if (flags & ElementFlags.Optional && optionalIndex < 0) {
@@ -14259,7 +14259,7 @@ namespace ts {
14259
14259
14260
14260
function getTypeFromRestTypeNode(node: RestTypeNode | NamedTupleMember) {
14261
14261
return getTypeFromTypeNode(getArrayElementTypeNode(node.type) || node.type);
14262
- }
14262
+ }
14263
14263
14264
14264
function getArrayElementTypeNode(node: TypeNode): TypeNode | undefined {
14265
14265
switch (node.kind) {
@@ -14270,12 +14270,12 @@ namespace ts {
14270
14270
node = (node as TupleTypeNode).elements[0];
14271
14271
if (node.kind === SyntaxKind.RestType || node.kind === SyntaxKind.NamedTupleMember && (node as NamedTupleMember).dotDotDotToken) {
14272
14272
return getArrayElementTypeNode((node as RestTypeNode | NamedTupleMember).type);
14273
- }
14274
- }
14273
+ }
14274
+ }
14275
14275
break;
14276
14276
case SyntaxKind.ArrayType:
14277
14277
return (node as ArrayTypeNode).elementType;
14278
- }
14278
+ }
14279
14279
return undefined;
14280
14280
}
14281
14281
@@ -16500,8 +16500,8 @@ namespace ts {
16500
16500
const suggestion = suggestionSymbol ? symbolToString(suggestionSymbol) : undefined;
16501
16501
if (suggestion) {
16502
16502
reportError(Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2, propName, typeToString(errorTarget), suggestion);
16503
- }
16504
- else {
16503
+ }
16504
+ else {
16505
16505
reportError(Diagnostics.Property_0_does_not_exist_on_type_1, propName, typeToString(errorTarget));
16506
16506
}
16507
16507
}
@@ -17456,26 +17456,26 @@ namespace ts {
17456
17456
const sourceMinLength = isTupleType(source) ? source.target.minLength : 0;
17457
17457
const targetMinLength = target.target.minLength;
17458
17458
if (!sourceRestFlag && sourceArity < targetMinLength) {
17459
- if (reportErrors) {
17459
+ if (reportErrors) {
17460
17460
reportError(Diagnostics.Source_has_0_element_s_but_target_requires_1, sourceArity, targetMinLength);
17461
- }
17462
- return Ternary.False;
17463
- }
17461
+ }
17462
+ return Ternary.False;
17463
+ }
17464
17464
if (!targetRestFlag && targetArity < sourceMinLength) {
17465
- if (reportErrors) {
17465
+ if (reportErrors) {
17466
17466
reportError(Diagnostics.Source_has_0_element_s_but_target_allows_only_1, sourceMinLength, targetArity);
17467
- }
17468
- return Ternary.False;
17469
17467
}
17468
+ return Ternary.False;
17469
+ }
17470
17470
if (!targetRestFlag && sourceRestFlag) {
17471
17471
if (reportErrors) {
17472
17472
if (sourceMinLength < targetMinLength) {
17473
17473
reportError(Diagnostics.Target_requires_0_element_s_but_source_may_have_fewer, targetMinLength);
17474
- }
17474
+ }
17475
17475
else {
17476
17476
reportError(Diagnostics.Target_allows_only_0_element_s_but_source_may_have_more, targetArity);
17477
- }
17478
- }
17477
+ }
17478
+ }
17479
17479
return Ternary.False;
17480
17480
}
17481
17481
const maxArity = Math.max(sourceArity, targetArity);
@@ -17484,12 +17484,12 @@ namespace ts {
17484
17484
const sourceFlags = isTupleType(source) && i < sourceArity ? source.target.elementFlags[i] : sourceRestFlag;
17485
17485
if (sourceFlags && targetFlags) {
17486
17486
if (targetFlags & ElementFlags.Variadic && !(sourceFlags & ElementFlags.Variadic) ||
17487
- (sourceFlags & ElementFlags.Variadic && !(targetFlags & ElementFlags.Variable))) {
17488
- if (reportErrors) {
17487
+ (sourceFlags & ElementFlags.Variadic && !(targetFlags & ElementFlags.Variable))) {
17488
+ if (reportErrors) {
17489
17489
reportError(Diagnostics.Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other, i);
17490
- }
17491
- return Ternary.False;
17492
- }
17490
+ }
17491
+ return Ternary.False;
17492
+ }
17493
17493
if (targetFlags & ElementFlags.Required) {
17494
17494
if (!(sourceFlags & ElementFlags.Required)) {
17495
17495
if (reportErrors) {
@@ -17502,17 +17502,17 @@ namespace ts {
17502
17502
const targetType = getTypeArguments(target)[Math.min(i, targetArity - 1)];
17503
17503
const targetCheckType = sourceFlags & ElementFlags.Variadic && targetFlags & ElementFlags.Rest ? createArrayType(targetType) : targetType;
17504
17504
const related = isRelatedTo(sourceType, targetCheckType, reportErrors, /*headMessage*/ undefined, intersectionState);
17505
- if (!related) {
17506
- if (reportErrors) {
17505
+ if (!related) {
17506
+ if (reportErrors) {
17507
17507
reportIncompatibleError(Diagnostics.Types_of_property_0_are_incompatible, i);
17508
+ }
17509
+ return Ternary.False;
17508
17510
}
17509
- return Ternary.False ;
17511
+ result &= related ;
17510
17512
}
17511
- result &= related;
17512
17513
}
17513
- }
17514
17514
return result;
17515
- }
17515
+ }
17516
17516
if (target.target.combinedFlags & ElementFlags.Variable) {
17517
17517
return Ternary.False;
17518
17518
}
@@ -19670,25 +19670,25 @@ namespace ts {
19670
19670
if (isTupleType(source) && isTupleTypeStructureMatching(source, target)) {
19671
19671
for (let i = 0; i < targetArity; i++) {
19672
19672
inferFromTypes(getTypeArguments(source)[i], elementTypes[i]);
19673
- }
19674
- return;
19675
19673
}
19674
+ return;
19675
+ }
19676
19676
const startLength = isTupleType(source) ? Math.min(source.target.fixedLength, target.target.fixedLength) : 0;
19677
19677
const sourceRestType = !isTupleType(source) || sourceArity > 0 && source.target.elementFlags[sourceArity - 1] & ElementFlags.Rest ?
19678
19678
getTypeArguments(source)[sourceArity - 1] : undefined;
19679
19679
const endLength = !(target.target.combinedFlags & ElementFlags.Variable) ? 0 :
19680
19680
sourceRestType ? getEndLengthOfType(target) :
19681
- Math.min(getEndLengthOfType(source), getEndLengthOfType(target));
19681
+ Math.min(getEndLengthOfType(source), getEndLengthOfType(target));
19682
19682
const sourceEndLength = sourceRestType ? 0 : endLength;
19683
19683
// Infer between starting fixed elements.
19684
19684
for (let i = 0; i < startLength; i++) {
19685
19685
inferFromTypes(getTypeArguments(source)[i], elementTypes[i]);
19686
- }
19686
+ }
19687
19687
if (sourceRestType && sourceArity - startLength === 1) {
19688
19688
// Single rest element remains in source, infer from that to every element in target
19689
19689
for (let i = startLength; i < targetArity - endLength; i++) {
19690
19690
inferFromTypes(elementFlags[i] & ElementFlags.Variadic ? createArrayType(sourceRestType) : sourceRestType, elementTypes[i]);
19691
- }
19691
+ }
19692
19692
}
19693
19693
else {
19694
19694
const middleLength = targetArity - startLength - endLength;
@@ -24072,7 +24072,7 @@ namespace ts {
24072
24072
if (isArrayLikeType(spreadType)) {
24073
24073
elementTypes.push(spreadType);
24074
24074
elementFlags.push(ElementFlags.Variadic);
24075
- }
24075
+ }
24076
24076
else if (inDestructuringPattern) {
24077
24077
// Given the following situation:
24078
24078
// var c: {};
@@ -24089,24 +24089,24 @@ namespace ts {
24089
24089
const restElementType = getIndexTypeOfType(spreadType, IndexKind.Number) ||
24090
24090
getIteratedTypeOrElementType(IterationUse.Destructuring, spreadType, undefinedType, /*errorNode*/ undefined, /*checkAssignability*/ false) ||
24091
24091
unknownType;
24092
- elementTypes.push(restElementType);
24092
+ elementTypes.push(restElementType);
24093
24093
elementFlags.push(ElementFlags.Rest);
24094
- }
24094
+ }
24095
24095
else {
24096
24096
elementTypes.push(checkIteratedTypeOrElementType(IterationUse.Spread, spreadType, undefinedType, (<SpreadElement>e).expression));
24097
24097
elementFlags.push(ElementFlags.Rest);
24098
24098
}
24099
24099
}
24100
- else {
24101
- const elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length);
24102
- const type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple);
24103
- elementTypes.push(type);
24100
+ else {
24101
+ const elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length);
24102
+ const type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple);
24103
+ elementTypes.push(type);
24104
24104
elementFlags.push(ElementFlags.Required);
24105
- }
24106
- }
24105
+ }
24106
+ }
24107
24107
if (inDestructuringPattern) {
24108
24108
return createTupleType(elementTypes, elementFlags);
24109
- }
24109
+ }
24110
24110
if (forceTuple || inConstContext || contextualType && forEachType(contextualType, isTupleLikeType)) {
24111
24111
return createArrayLiteralType(createTupleType(elementTypes, elementFlags, /*readonly*/ inConstContext));
24112
24112
}
@@ -26013,8 +26013,8 @@ namespace ts {
26013
26013
const spreadArgIndex = getSpreadArgumentIndex(args);
26014
26014
if (spreadArgIndex >= 0) {
26015
26015
return spreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || spreadArgIndex < getParameterCount(signature));
26016
- }
26017
- }
26016
+ }
26017
+ }
26018
26018
26019
26019
// Too many arguments implies incorrect arity.
26020
26020
if (!hasEffectiveRestParameter(signature) && argCount > effectiveParameterCount) {
@@ -26199,22 +26199,22 @@ namespace ts {
26199
26199
if (isArrayLikeType(spreadType)) {
26200
26200
types.push(spreadType);
26201
26201
flags.push(ElementFlags.Variadic);
26202
- }
26202
+ }
26203
26203
else {
26204
26204
types.push(checkIteratedTypeOrElementType(IterationUse.Spread, spreadType, undefinedType, arg.kind === SyntaxKind.SpreadElement ? (<SpreadElement>arg).expression : arg));
26205
26205
flags.push(ElementFlags.Rest);
26206
- }
26206
+ }
26207
26207
}
26208
26208
else {
26209
26209
const contextualType = getIndexedAccessType(restType, getLiteralType(i - index));
26210
26210
const argType = checkExpressionWithContextualType(arg, contextualType, context, checkMode);
26211
- const hasPrimitiveContextualType = maybeTypeOfKind(contextualType, TypeFlags.Primitive | TypeFlags.Index);
26212
- types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType));
26211
+ const hasPrimitiveContextualType = maybeTypeOfKind(contextualType, TypeFlags.Primitive | TypeFlags.Index);
26212
+ types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType));
26213
26213
flags.push(ElementFlags.Required);
26214
- }
26214
+ }
26215
26215
if (arg.kind === SyntaxKind.SyntheticExpression && (arg as SyntheticExpression).tupleNameSource) {
26216
26216
names.push((arg as SyntheticExpression).tupleNameSource!);
26217
- }
26217
+ }
26218
26218
}
26219
26219
return createTupleType(types, flags, /*readonly*/ false, length(names) === length(types) ? names : undefined);
26220
26220
}
@@ -26510,10 +26510,10 @@ namespace ts {
26510
26510
!!(flags & ElementFlags.Variable), spreadType.target.labeledElementDeclarations?.[i]);
26511
26511
effectiveArgs.push(syntheticArg);
26512
26512
});
26513
- }
26513
+ }
26514
26514
else {
26515
26515
effectiveArgs.push(arg);
26516
- }
26516
+ }
26517
26517
}
26518
26518
return effectiveArgs;
26519
26519
}
@@ -28138,7 +28138,7 @@ namespace ts {
28138
28138
const names = [];
28139
28139
for (let i = pos; i < parameterCount; i++) {
28140
28140
if (!restType || i < parameterCount - 1) {
28141
- types.push(getTypeAtPosition(source, i));
28141
+ types.push(getTypeAtPosition(source, i));
28142
28142
flags.push(i < minArgumentCount ? ElementFlags.Required : ElementFlags.Optional);
28143
28143
}
28144
28144
else {
@@ -28149,9 +28149,9 @@ namespace ts {
28149
28149
if (name) {
28150
28150
names.push(name);
28151
28151
}
28152
- }
28153
- return createTupleType(types, flags, /*readonly*/ false, length(names) === length(types) ? names : undefined);
28154
28152
}
28153
+ return createTupleType(types, flags, /*readonly*/ false, length(names) === length(types) ? names : undefined);
28154
+ }
28155
28155
28156
28156
function getParameterCount(signature: Signature) {
28157
28157
const length = signature.parameters.length;
@@ -28194,7 +28194,7 @@ namespace ts {
28194
28194
const restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]);
28195
28195
if (!isTupleType(restType)) {
28196
28196
return restType;
28197
- }
28197
+ }
28198
28198
if (restType.target.hasRestElement) {
28199
28199
return sliceTupleType(restType, restType.target.fixedLength);
28200
28200
}
@@ -31286,7 +31286,7 @@ namespace ts {
31286
31286
grammarErrorOnNode(e, Diagnostics.A_rest_element_must_be_last_in_a_tuple_type);
31287
31287
break;
31288
31288
}
31289
- }
31289
+ }
31290
31290
else if (flags & ElementFlags.Optional) {
31291
31291
seenOptionalElement = true;
31292
31292
}
0 commit comments