@@ -2542,6 +2542,12 @@ namespace ts {
25422542 const type = <ObjectType>createType(TypeFlags.Object);
25432543 type.objectFlags = objectFlags;
25442544 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;
25452551 return type;
25462552 }
25472553
@@ -2563,23 +2569,20 @@ namespace ts {
25632569 function getNamedMembers(members: SymbolTable): Symbol[] {
25642570 let result: Symbol[] | undefined;
25652571 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);
25712574 }
25722575 });
25732576 return result || emptyArray;
25742577 }
25752578
25762579 function setStructuredTypeMembers(type: StructuredType, members: SymbolTable, callSignatures: ReadonlyArray<Signature>, constructSignatures: ReadonlyArray<Signature>, stringIndexInfo: IndexInfo | undefined, numberIndexInfo: IndexInfo | undefined): ResolvedType {
25772580 (<ResolvedType>type).members = members;
2578- (<ResolvedType>type).properties = getNamedMembers(members);
2581+ (<ResolvedType>type).properties = members === emptySymbols ? emptyArray : getNamedMembers(members);
25792582 (<ResolvedType>type).callSignatures = callSignatures;
25802583 (<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;
25832586 return <ResolvedType>type;
25842587 }
25852588
@@ -5450,7 +5453,7 @@ namespace ts {
54505453 // (otherwise there'd be an error from hasBaseType) - this is fine, but `.members` should be reset
54515454 // as `getIndexedAccessType` via `instantiateType` via `getTypeFromClassOrInterfaceReference` forces a
54525455 // 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;
54545457 }
54555458 return type.resolvedBaseTypes = [baseType];
54565459 }
@@ -6380,6 +6383,7 @@ namespace ts {
63806383 function resolveAnonymousTypeMembers(type: AnonymousType) {
63816384 const symbol = type.symbol;
63826385 if (type.target) {
6386+ setStructuredTypeMembers(type, emptySymbols, emptyArray, emptyArray, undefined, undefined);
63836387 const members = createInstantiatedSymbolTable(getPropertiesOfObjectType(type.target), type.mapper!, /*mappingThisOnly*/ false);
63846388 const callSignatures = instantiateSignatures(getSignaturesOfType(type.target, SignatureKind.Call), type.mapper!);
63856389 const constructSignatures = instantiateSignatures(getSignaturesOfType(type.target, SignatureKind.Construct), type.mapper!);
@@ -6388,6 +6392,7 @@ namespace ts {
63886392 setStructuredTypeMembers(type, members, callSignatures, constructSignatures, stringIndexInfo, numberIndexInfo);
63896393 }
63906394 else if (symbol.flags & SymbolFlags.TypeLiteral) {
6395+ setStructuredTypeMembers(type, emptySymbols, emptyArray, emptyArray, undefined, undefined);
63916396 const members = getMembersOfSymbol(symbol);
63926397 const callSignatures = getSignaturesOfSymbol(members.get(InternalSymbolName.Call));
63936398 const constructSignatures = getSignaturesOfSymbol(members.get(InternalSymbolName.New));
@@ -6421,7 +6426,7 @@ namespace ts {
64216426 // in the process of resolving (see issue #6072). The temporarily empty signature list
64226427 // will never be observed because a qualified name can't reference signatures.
64236428 if (symbol.flags & (SymbolFlags.Function | SymbolFlags.Method)) {
6424- (<ResolvedType> type) .callSignatures = getSignaturesOfSymbol(symbol);
6429+ type.callSignatures = getSignaturesOfSymbol(symbol);
64256430 }
64266431 // And likewise for construct signatures for classes
64276432 if (symbol.flags & SymbolFlags.Class) {
@@ -6430,7 +6435,7 @@ namespace ts {
64306435 if (!constructSignatures.length) {
64316436 constructSignatures = getDefaultConstructSignatures(classType);
64326437 }
6433- (<ResolvedType> type) .constructSignatures = constructSignatures;
6438+ type.constructSignatures = constructSignatures;
64346439 }
64356440 }
64366441 }
@@ -7610,7 +7615,7 @@ namespace ts {
76107615 // will result in a different declaration kind.
76117616 if (!signature.isolatedSignatureType) {
76127617 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);
76147619 type.members = emptySymbols;
76157620 type.properties = emptyArray;
76167621 type.callSignatures = !isConstructor ? [signature] : emptyArray;
@@ -10046,7 +10051,7 @@ namespace ts {
1004610051 if (type.flags & TypeFlags.Object) {
1004710052 const resolved = resolveStructuredTypeMembers(<ObjectType>type);
1004810053 if (resolved.constructSignatures.length) {
10049- const result = <ResolvedType> createObjectType(ObjectFlags.Anonymous, type.symbol);
10054+ const result = createObjectType(ObjectFlags.Anonymous, type.symbol);
1005010055 result.members = resolved.members;
1005110056 result.properties = resolved.properties;
1005210057 result.callSignatures = emptyArray;
0 commit comments