@@ -2608,6 +2608,12 @@ namespace ts {
2608
2608
const type = <ObjectType>createType(TypeFlags.Object);
2609
2609
type.objectFlags = objectFlags;
2610
2610
type.symbol = symbol!;
2611
+ type.members = undefined;
2612
+ type.properties = undefined;
2613
+ type.callSignatures = undefined;
2614
+ type.constructSignatures = undefined;
2615
+ type.stringIndexInfo = undefined;
2616
+ type.numberIndexInfo = undefined;
2611
2617
return type;
2612
2618
}
2613
2619
@@ -2629,23 +2635,20 @@ namespace ts {
2629
2635
function getNamedMembers(members: SymbolTable): Symbol[] {
2630
2636
let result: Symbol[] | undefined;
2631
2637
members.forEach((symbol, id) => {
2632
- if (!isReservedMemberName(id)) {
2633
- if (!result) result = [];
2634
- if (symbolIsValue(symbol)) {
2635
- result.push(symbol);
2636
- }
2638
+ if (!isReservedMemberName(id) && symbolIsValue(symbol)) {
2639
+ (result || (result = [])).push(symbol);
2637
2640
}
2638
2641
});
2639
2642
return result || emptyArray;
2640
2643
}
2641
2644
2642
2645
function setStructuredTypeMembers(type: StructuredType, members: SymbolTable, callSignatures: ReadonlyArray<Signature>, constructSignatures: ReadonlyArray<Signature>, stringIndexInfo: IndexInfo | undefined, numberIndexInfo: IndexInfo | undefined): ResolvedType {
2643
2646
(<ResolvedType>type).members = members;
2644
- (<ResolvedType>type).properties = getNamedMembers(members);
2647
+ (<ResolvedType>type).properties = members === emptySymbols ? emptyArray : getNamedMembers(members);
2645
2648
(<ResolvedType>type).callSignatures = callSignatures;
2646
2649
(<ResolvedType>type).constructSignatures = constructSignatures;
2647
- if (stringIndexInfo) (<ResolvedType>type).stringIndexInfo = stringIndexInfo;
2648
- if (numberIndexInfo) (<ResolvedType>type).numberIndexInfo = numberIndexInfo;
2650
+ (<ResolvedType>type).stringIndexInfo = stringIndexInfo;
2651
+ (<ResolvedType>type).numberIndexInfo = numberIndexInfo;
2649
2652
return <ResolvedType>type;
2650
2653
}
2651
2654
@@ -5514,7 +5517,7 @@ namespace ts {
5514
5517
// (otherwise there'd be an error from hasBaseType) - this is fine, but `.members` should be reset
5515
5518
// as `getIndexedAccessType` via `instantiateType` via `getTypeFromClassOrInterfaceReference` forces a
5516
5519
// partial instantiation of the members without the base types fully resolved
5517
- ( type as Type as ResolvedType) .members = undefined! ; // TODO: GH#18217
5520
+ type.members = undefined; // TODO: GH#18217
5518
5521
}
5519
5522
return type.resolvedBaseTypes = [baseType];
5520
5523
}
@@ -6444,6 +6447,7 @@ namespace ts {
6444
6447
function resolveAnonymousTypeMembers(type: AnonymousType) {
6445
6448
const symbol = type.symbol;
6446
6449
if (type.target) {
6450
+ setStructuredTypeMembers(type, emptySymbols, emptyArray, emptyArray, undefined, undefined);
6447
6451
const members = createInstantiatedSymbolTable(getPropertiesOfObjectType(type.target), type.mapper!, /*mappingThisOnly*/ false);
6448
6452
const callSignatures = instantiateSignatures(getSignaturesOfType(type.target, SignatureKind.Call), type.mapper!);
6449
6453
const constructSignatures = instantiateSignatures(getSignaturesOfType(type.target, SignatureKind.Construct), type.mapper!);
@@ -6452,6 +6456,7 @@ namespace ts {
6452
6456
setStructuredTypeMembers(type, members, callSignatures, constructSignatures, stringIndexInfo, numberIndexInfo);
6453
6457
}
6454
6458
else if (symbol.flags & SymbolFlags.TypeLiteral) {
6459
+ setStructuredTypeMembers(type, emptySymbols, emptyArray, emptyArray, undefined, undefined);
6455
6460
const members = getMembersOfSymbol(symbol);
6456
6461
const callSignatures = getSignaturesOfSymbol(members.get(InternalSymbolName.Call));
6457
6462
const constructSignatures = getSignaturesOfSymbol(members.get(InternalSymbolName.New));
@@ -6485,7 +6490,7 @@ namespace ts {
6485
6490
// in the process of resolving (see issue #6072). The temporarily empty signature list
6486
6491
// will never be observed because a qualified name can't reference signatures.
6487
6492
if (symbol.flags & (SymbolFlags.Function | SymbolFlags.Method)) {
6488
- (<ResolvedType> type) .callSignatures = getSignaturesOfSymbol(symbol);
6493
+ type.callSignatures = getSignaturesOfSymbol(symbol);
6489
6494
}
6490
6495
// And likewise for construct signatures for classes
6491
6496
if (symbol.flags & SymbolFlags.Class) {
@@ -6494,7 +6499,7 @@ namespace ts {
6494
6499
if (!constructSignatures.length) {
6495
6500
constructSignatures = getDefaultConstructSignatures(classType);
6496
6501
}
6497
- (<ResolvedType> type) .constructSignatures = constructSignatures;
6502
+ type.constructSignatures = constructSignatures;
6498
6503
}
6499
6504
}
6500
6505
}
@@ -7674,7 +7679,7 @@ namespace ts {
7674
7679
// will result in a different declaration kind.
7675
7680
if (!signature.isolatedSignatureType) {
7676
7681
const isConstructor = signature.declaration!.kind === SyntaxKind.Constructor || signature.declaration!.kind === SyntaxKind.ConstructSignature; // TODO: GH#18217
7677
- const type = <ResolvedType> createObjectType(ObjectFlags.Anonymous);
7682
+ const type = createObjectType(ObjectFlags.Anonymous);
7678
7683
type.members = emptySymbols;
7679
7684
type.properties = emptyArray;
7680
7685
type.callSignatures = !isConstructor ? [signature] : emptyArray;
@@ -10110,7 +10115,7 @@ namespace ts {
10110
10115
if (type.flags & TypeFlags.Object) {
10111
10116
const resolved = resolveStructuredTypeMembers(<ObjectType>type);
10112
10117
if (resolved.constructSignatures.length) {
10113
- const result = <ResolvedType> createObjectType(ObjectFlags.Anonymous, type.symbol);
10118
+ const result = createObjectType(ObjectFlags.Anonymous, type.symbol);
10114
10119
result.members = resolved.members;
10115
10120
result.properties = resolved.properties;
10116
10121
result.callSignatures = emptyArray;
0 commit comments