@@ -2542,6 +2542,12 @@ namespace ts {
2542
2542
const type = <ObjectType>createType(TypeFlags.Object);
2543
2543
type.objectFlags = objectFlags;
2544
2544
type.symbol = symbol!;
2545
+ type.members = undefined;
2546
+ type.properties = undefined;
2547
+ type.callSignatures = undefined;
2548
+ type.constructSignatures = undefined;
2549
+ type.stringIndexInfo = undefined;
2550
+ type.numberIndexInfo = undefined;
2545
2551
return type;
2546
2552
}
2547
2553
@@ -2563,23 +2569,20 @@ namespace ts {
2563
2569
function getNamedMembers(members: SymbolTable): Symbol[] {
2564
2570
let result: Symbol[] | undefined;
2565
2571
members.forEach((symbol, id) => {
2566
- if (!isReservedMemberName(id)) {
2567
- if (!result) result = [];
2568
- if (symbolIsValue(symbol)) {
2569
- result.push(symbol);
2570
- }
2572
+ if (!isReservedMemberName(id) && symbolIsValue(symbol)) {
2573
+ (result || (result = [])).push(symbol);
2571
2574
}
2572
2575
});
2573
2576
return result || emptyArray;
2574
2577
}
2575
2578
2576
2579
function setStructuredTypeMembers(type: StructuredType, members: SymbolTable, callSignatures: ReadonlyArray<Signature>, constructSignatures: ReadonlyArray<Signature>, stringIndexInfo: IndexInfo | undefined, numberIndexInfo: IndexInfo | undefined): ResolvedType {
2577
2580
(<ResolvedType>type).members = members;
2578
- (<ResolvedType>type).properties = getNamedMembers(members);
2581
+ (<ResolvedType>type).properties = members === emptySymbols ? emptyArray : getNamedMembers(members);
2579
2582
(<ResolvedType>type).callSignatures = callSignatures;
2580
2583
(<ResolvedType>type).constructSignatures = constructSignatures;
2581
- if (stringIndexInfo) (<ResolvedType>type).stringIndexInfo = stringIndexInfo;
2582
- if (numberIndexInfo) (<ResolvedType>type).numberIndexInfo = numberIndexInfo;
2584
+ (<ResolvedType>type).stringIndexInfo = stringIndexInfo;
2585
+ (<ResolvedType>type).numberIndexInfo = numberIndexInfo;
2583
2586
return <ResolvedType>type;
2584
2587
}
2585
2588
@@ -5450,7 +5453,7 @@ namespace ts {
5450
5453
// (otherwise there'd be an error from hasBaseType) - this is fine, but `.members` should be reset
5451
5454
// as `getIndexedAccessType` via `instantiateType` via `getTypeFromClassOrInterfaceReference` forces a
5452
5455
// partial instantiation of the members without the base types fully resolved
5453
- ( type as Type as ResolvedType) .members = undefined!; // TODO: GH#18217
5456
+ type.members = undefined;
5454
5457
}
5455
5458
return type.resolvedBaseTypes = [baseType];
5456
5459
}
@@ -6380,6 +6383,7 @@ namespace ts {
6380
6383
function resolveAnonymousTypeMembers(type: AnonymousType) {
6381
6384
const symbol = type.symbol;
6382
6385
if (type.target) {
6386
+ setStructuredTypeMembers(type, emptySymbols, emptyArray, emptyArray, undefined, undefined);
6383
6387
const members = createInstantiatedSymbolTable(getPropertiesOfObjectType(type.target), type.mapper!, /*mappingThisOnly*/ false);
6384
6388
const callSignatures = instantiateSignatures(getSignaturesOfType(type.target, SignatureKind.Call), type.mapper!);
6385
6389
const constructSignatures = instantiateSignatures(getSignaturesOfType(type.target, SignatureKind.Construct), type.mapper!);
@@ -6388,6 +6392,7 @@ namespace ts {
6388
6392
setStructuredTypeMembers(type, members, callSignatures, constructSignatures, stringIndexInfo, numberIndexInfo);
6389
6393
}
6390
6394
else if (symbol.flags & SymbolFlags.TypeLiteral) {
6395
+ setStructuredTypeMembers(type, emptySymbols, emptyArray, emptyArray, undefined, undefined);
6391
6396
const members = getMembersOfSymbol(symbol);
6392
6397
const callSignatures = getSignaturesOfSymbol(members.get(InternalSymbolName.Call));
6393
6398
const constructSignatures = getSignaturesOfSymbol(members.get(InternalSymbolName.New));
@@ -6421,7 +6426,7 @@ namespace ts {
6421
6426
// in the process of resolving (see issue #6072). The temporarily empty signature list
6422
6427
// will never be observed because a qualified name can't reference signatures.
6423
6428
if (symbol.flags & (SymbolFlags.Function | SymbolFlags.Method)) {
6424
- (<ResolvedType> type) .callSignatures = getSignaturesOfSymbol(symbol);
6429
+ type.callSignatures = getSignaturesOfSymbol(symbol);
6425
6430
}
6426
6431
// And likewise for construct signatures for classes
6427
6432
if (symbol.flags & SymbolFlags.Class) {
@@ -6430,7 +6435,7 @@ namespace ts {
6430
6435
if (!constructSignatures.length) {
6431
6436
constructSignatures = getDefaultConstructSignatures(classType);
6432
6437
}
6433
- (<ResolvedType> type) .constructSignatures = constructSignatures;
6438
+ type.constructSignatures = constructSignatures;
6434
6439
}
6435
6440
}
6436
6441
}
@@ -7610,7 +7615,7 @@ namespace ts {
7610
7615
// will result in a different declaration kind.
7611
7616
if (!signature.isolatedSignatureType) {
7612
7617
const isConstructor = signature.declaration!.kind === SyntaxKind.Constructor || signature.declaration!.kind === SyntaxKind.ConstructSignature; // TODO: GH#18217
7613
- const type = <ResolvedType> createObjectType(ObjectFlags.Anonymous);
7618
+ const type = createObjectType(ObjectFlags.Anonymous);
7614
7619
type.members = emptySymbols;
7615
7620
type.properties = emptyArray;
7616
7621
type.callSignatures = !isConstructor ? [signature] : emptyArray;
@@ -10046,7 +10051,7 @@ namespace ts {
10046
10051
if (type.flags & TypeFlags.Object) {
10047
10052
const resolved = resolveStructuredTypeMembers(<ObjectType>type);
10048
10053
if (resolved.constructSignatures.length) {
10049
- const result = <ResolvedType> createObjectType(ObjectFlags.Anonymous, type.symbol);
10054
+ const result = createObjectType(ObjectFlags.Anonymous, type.symbol);
10050
10055
result.members = resolved.members;
10051
10056
result.properties = resolved.properties;
10052
10057
result.callSignatures = emptyArray;
0 commit comments