@@ -4606,7 +4606,7 @@ namespace ts {
4606
4606
// Create a mapper from T to the current iteration type constituent. Then, if the
4607
4607
// mapped type is itself an instantiated type, combine the iteration mapper with the
4608
4608
// instantiation mapper.
4609
- const iterationMapper = createUnaryTypeMapper( typeParameter, t );
4609
+ const iterationMapper = createTypeMapper([ typeParameter], [t] );
4610
4610
const templateMapper = type.mapper ? combineTypeMappers(type.mapper, iterationMapper) : iterationMapper;
4611
4611
const propType = instantiateType(templateType, templateMapper);
4612
4612
// If the current iteration type constituent is a string literal type, create a property.
@@ -4666,7 +4666,7 @@ namespace ts {
4666
4666
}
4667
4667
4668
4668
function getErasedTemplateTypeFromMappedType(type: MappedType) {
4669
- return instantiateType(getTemplateTypeFromMappedType(type), createUnaryTypeMapper( getTypeParameterFromMappedType(type), anyType ));
4669
+ return instantiateType(getTemplateTypeFromMappedType(type), createTypeEraser([ getTypeParameterFromMappedType(type)] ));
4670
4670
}
4671
4671
4672
4672
function isGenericMappedType(type: Type) {
@@ -5058,9 +5058,10 @@ namespace ts {
5058
5058
if (!links.resolvedSignature) {
5059
5059
const parameters: Symbol[] = [];
5060
5060
let hasLiteralTypes = false;
5061
- let minArgumentCount = -1 ;
5061
+ let minArgumentCount = 0 ;
5062
5062
let thisParameter: Symbol = undefined;
5063
5063
let hasThisParameter: boolean;
5064
+ const iife = getImmediatelyInvokedFunctionExpression(declaration);
5064
5065
const isJSConstructSignature = isJSDocConstructSignature(declaration);
5065
5066
5066
5067
// If this is a JSDoc construct signature, then skip the first parameter in the
@@ -5087,14 +5088,12 @@ namespace ts {
5087
5088
hasLiteralTypes = true;
5088
5089
}
5089
5090
5090
- if (param.initializer || param.questionToken || param.dotDotDotToken || isJSDocOptionalParameter(param)) {
5091
- if (minArgumentCount < 0) {
5092
- minArgumentCount = i - (hasThisParameter ? 1 : 0);
5093
- }
5094
- }
5095
- else {
5096
- // If we see any required parameters, it means the prior ones were not in fact optional.
5097
- minArgumentCount = -1;
5091
+ // Record a new minimum argument count if this is not an optional parameter
5092
+ const isOptionalParameter = param.initializer || param.questionToken || param.dotDotDotToken ||
5093
+ iife && parameters.length > iife.arguments.length && !param.type ||
5094
+ isJSDocOptionalParameter(param);
5095
+ if (!isOptionalParameter) {
5096
+ minArgumentCount = parameters.length;
5098
5097
}
5099
5098
}
5100
5099
@@ -5109,13 +5108,6 @@ namespace ts {
5109
5108
}
5110
5109
}
5111
5110
5112
- if (minArgumentCount < 0) {
5113
- minArgumentCount = declaration.parameters.length - (hasThisParameter ? 1 : 0);
5114
- }
5115
- if (isJSConstructSignature) {
5116
- minArgumentCount--;
5117
- }
5118
-
5119
5111
const classType = declaration.kind === SyntaxKind.Constructor ?
5120
5112
getDeclaredTypeOfClassOrInterface(getMergedSymbol((<ClassDeclaration>declaration.parent).symbol))
5121
5113
: undefined;
@@ -6135,7 +6127,7 @@ namespace ts {
6135
6127
error(accessExpression, Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(type));
6136
6128
return unknownType;
6137
6129
}
6138
- const mapper = createUnaryTypeMapper( getTypeParameterFromMappedType(type), indexType);
6130
+ const mapper = createTypeMapper([ getTypeParameterFromMappedType(type)], [ indexType] );
6139
6131
const templateMapper = type.mapper ? combineTypeMappers(type.mapper, mapper) : mapper;
6140
6132
return instantiateType(getTemplateTypeFromMappedType(type), templateMapper);
6141
6133
}
@@ -6241,7 +6233,7 @@ namespace ts {
6241
6233
* this function should be called in a left folding style, with left = previous result of getSpreadType
6242
6234
* and right = the new element to be spread.
6243
6235
*/
6244
- function getSpreadType(left: Type, right: Type, isFromObjectLiteral: boolean ): Type {
6236
+ function getSpreadType(left: Type, right: Type): Type {
6245
6237
if (left.flags & TypeFlags.Any || right.flags & TypeFlags.Any) {
6246
6238
return anyType;
6247
6239
}
@@ -6254,10 +6246,10 @@ namespace ts {
6254
6246
return left;
6255
6247
}
6256
6248
if (left.flags & TypeFlags.Union) {
6257
- return mapType(left, t => getSpreadType(t, right, isFromObjectLiteral ));
6249
+ return mapType(left, t => getSpreadType(t, right));
6258
6250
}
6259
6251
if (right.flags & TypeFlags.Union) {
6260
- return mapType(right, t => getSpreadType(left, t, isFromObjectLiteral ));
6252
+ return mapType(right, t => getSpreadType(left, t));
6261
6253
}
6262
6254
6263
6255
const members = createMap<Symbol>();
@@ -6276,18 +6268,18 @@ namespace ts {
6276
6268
6277
6269
for (const rightProp of getPropertiesOfType(right)) {
6278
6270
// we approximate own properties as non-methods plus methods that are inside the object literal
6279
- const isOwnProperty = !(rightProp.flags & SymbolFlags.Method) || isFromObjectLiteral;
6280
6271
const isSetterWithoutGetter = rightProp.flags & SymbolFlags.SetAccessor && !(rightProp.flags & SymbolFlags.GetAccessor);
6281
6272
if (getDeclarationModifierFlagsFromSymbol(rightProp) & (ModifierFlags.Private | ModifierFlags.Protected)) {
6282
6273
skippedPrivateMembers[rightProp.name] = true;
6283
6274
}
6284
- else if (isOwnProperty && !isSetterWithoutGetter) {
6275
+ else if (!isClassMethod(rightProp) && !isSetterWithoutGetter) {
6285
6276
members[rightProp.name] = rightProp;
6286
6277
}
6287
6278
}
6288
6279
for (const leftProp of getPropertiesOfType(left)) {
6289
6280
if (leftProp.flags & SymbolFlags.SetAccessor && !(leftProp.flags & SymbolFlags.GetAccessor)
6290
- || leftProp.name in skippedPrivateMembers) {
6281
+ || leftProp.name in skippedPrivateMembers
6282
+ || isClassMethod(leftProp)) {
6291
6283
continue;
6292
6284
}
6293
6285
if (leftProp.name in members) {
@@ -6312,6 +6304,10 @@ namespace ts {
6312
6304
return createAnonymousType(undefined, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
6313
6305
}
6314
6306
6307
+ function isClassMethod(prop: Symbol) {
6308
+ return prop.flags & SymbolFlags.Method && find(prop.declarations, decl => isClassLike(decl.parent));
6309
+ }
6310
+
6315
6311
function createLiteralType(flags: TypeFlags, text: string) {
6316
6312
const type = <LiteralType>createType(flags);
6317
6313
type.text = text;
@@ -6502,16 +6498,16 @@ namespace ts {
6502
6498
return <T>instantiations[type.id] || (instantiations[type.id] = instantiator(type, mapper));
6503
6499
}
6504
6500
6505
- function createUnaryTypeMapper (source: Type, target: Type): TypeMapper {
6506
- return t => t === source ? target : t;
6501
+ function makeUnaryTypeMapper (source: Type, target: Type) {
6502
+ return (t: Type) => t === source ? target : t;
6507
6503
}
6508
6504
6509
- function createBinaryTypeMapper (source1: Type, target1: Type, source2: Type, target2: Type): TypeMapper {
6510
- return t => t === source1 ? target1 : t === source2 ? target2 : t;
6505
+ function makeBinaryTypeMapper (source1: Type, target1: Type, source2: Type, target2: Type) {
6506
+ return (t: Type) => t === source1 ? target1 : t === source2 ? target2 : t;
6511
6507
}
6512
6508
6513
- function createArrayTypeMapper (sources: Type[], targets: Type[]): TypeMapper {
6514
- return t => {
6509
+ function makeArrayTypeMapper (sources: Type[], targets: Type[]) {
6510
+ return (t: Type) => {
6515
6511
for (let i = 0; i < sources.length; i++) {
6516
6512
if (t === sources[i]) {
6517
6513
return targets ? targets[i] : anyType;
@@ -6522,11 +6518,9 @@ namespace ts {
6522
6518
}
6523
6519
6524
6520
function createTypeMapper(sources: Type[], targets: Type[]): TypeMapper {
6525
- const count = sources.length;
6526
- const mapper: TypeMapper =
6527
- count == 1 ? createUnaryTypeMapper(sources[0], targets ? targets[0] : anyType) :
6528
- count == 2 ? createBinaryTypeMapper(sources[0], targets ? targets[0] : anyType, sources[1], targets ? targets[1] : anyType) :
6529
- createArrayTypeMapper(sources, targets);
6521
+ const mapper: TypeMapper = sources.length === 1 ? makeUnaryTypeMapper(sources[0], targets ? targets[0] : anyType) :
6522
+ sources.length === 2 ? makeBinaryTypeMapper(sources[0], targets ? targets[0] : anyType, sources[1], targets ? targets[1] : anyType) :
6523
+ makeArrayTypeMapper(sources, targets);
6530
6524
mapper.mappedTypes = sources;
6531
6525
return mapper;
6532
6526
}
@@ -6560,7 +6554,7 @@ namespace ts {
6560
6554
6561
6555
function combineTypeMappers(mapper1: TypeMapper, mapper2: TypeMapper): TypeMapper {
6562
6556
const mapper: TypeMapper = t => instantiateType(mapper1(t), mapper2);
6563
- mapper.mappedTypes = mapper1.mappedTypes;
6557
+ mapper.mappedTypes = concatenate( mapper1.mappedTypes, mapper2.mappedTypes) ;
6564
6558
return mapper;
6565
6559
}
6566
6560
@@ -10936,23 +10930,23 @@ namespace ts {
10936
10930
const func = parameter.parent;
10937
10931
if (isContextSensitiveFunctionOrObjectLiteralMethod(func)) {
10938
10932
const iife = getImmediatelyInvokedFunctionExpression(func);
10939
- if (iife) {
10933
+ if (iife && iife.arguments ) {
10940
10934
const indexOfParameter = indexOf(func.parameters, parameter);
10941
- if (iife.arguments && indexOfParameter < iife.arguments.length ) {
10942
- if (parameter.dotDotDotToken) {
10943
- const restTypes: Type[] = [];
10944
- for (let i = indexOfParameter; i < iife.arguments.length; i++) {
10945
- restTypes.push(getWidenedLiteralType(checkExpression(iife.arguments[i])));
10946
- }
10947
- return createArrayType(getUnionType(restTypes));
10948
- }
10949
- const links = getNodeLinks(iife) ;
10950
- const cached = links.resolvedSignature;
10951
- links.resolvedSignature = anySignature;
10952
- const type = getWidenedLiteralType(checkExpression(iife.arguments[indexOfParameter]));
10953
- links.resolvedSignature = cached ;
10954
- return type ;
10955
- }
10935
+ if (parameter.dotDotDotToken ) {
10936
+ const restTypes: Type[] = [];
10937
+ for (let i = indexOfParameter; i < iife.arguments.length; i++) {
10938
+ restTypes.push(getWidenedLiteralType(checkExpression( iife.arguments[i])));
10939
+ }
10940
+ return restTypes.length ? createArrayType(getUnionType(restTypes)) : undefined;
10941
+ }
10942
+ const links = getNodeLinks(iife);
10943
+ const cached = links.resolvedSignature ;
10944
+ links.resolvedSignature = anySignature ;
10945
+ const type = indexOfParameter < iife.arguments.length ?
10946
+ getWidenedLiteralType(checkExpression(iife.arguments[indexOfParameter])) :
10947
+ parameter.initializer ? undefined : undefinedWideningType ;
10948
+ links.resolvedSignature = cached ;
10949
+ return type;
10956
10950
}
10957
10951
const contextualSignature = getContextualSignature(func);
10958
10952
if (contextualSignature) {
@@ -11661,7 +11655,7 @@ namespace ts {
11661
11655
checkExternalEmitHelpers(memberDecl, ExternalEmitHelpers.Assign);
11662
11656
}
11663
11657
if (propertiesArray.length > 0) {
11664
- spread = getSpreadType(spread, createObjectLiteralType(), /*isFromObjectLiteral*/ true );
11658
+ spread = getSpreadType(spread, createObjectLiteralType());
11665
11659
propertiesArray = [];
11666
11660
propertiesTable = createMap<Symbol>();
11667
11661
hasComputedStringProperty = false;
@@ -11673,7 +11667,7 @@ namespace ts {
11673
11667
error(memberDecl, Diagnostics.Spread_types_may_only_be_created_from_object_types);
11674
11668
return unknownType;
11675
11669
}
11676
- spread = getSpreadType(spread, type, /*isFromObjectLiteral*/ false );
11670
+ spread = getSpreadType(spread, type);
11677
11671
offset = i + 1;
11678
11672
continue;
11679
11673
}
@@ -11718,7 +11712,7 @@ namespace ts {
11718
11712
11719
11713
if (spread !== emptyObjectType) {
11720
11714
if (propertiesArray.length > 0) {
11721
- spread = getSpreadType(spread, createObjectLiteralType(), /*isFromObjectLiteral*/ true );
11715
+ spread = getSpreadType(spread, createObjectLiteralType());
11722
11716
}
11723
11717
if (spread.flags & TypeFlags.Object) {
11724
11718
// only set the symbol and flags if this is a (fresh) object type
0 commit comments