@@ -108,10 +108,10 @@ namespace ts {
108108 getEmitResolver,
109109 getExportsOfModule: getExportsOfModuleAsArray,
110110 getAmbientModules,
111-
112111 getJsxElementAttributesType,
113112 getJsxIntrinsicTagNames,
114113 isOptionalParameter,
114+ tryGetMemberInModuleExports,
115115 tryFindAmbientModuleWithoutAugmentations: moduleName => {
116116 // we deliberately exclude augmentations
117117 // since we are only interested in declarations of the module itself
@@ -1489,6 +1489,13 @@ namespace ts {
14891489 return symbolsToArray(getExportsOfModule(moduleSymbol));
14901490 }
14911491
1492+ function tryGetMemberInModuleExports(memberName: string, moduleSymbol: Symbol): Symbol | undefined {
1493+ const symbolTable = getExportsOfModule(moduleSymbol);
1494+ if (symbolTable) {
1495+ return symbolTable[memberName];
1496+ }
1497+ }
1498+
14921499 function getExportsOfSymbol(symbol: Symbol): SymbolTable {
14931500 return symbol.flags & SymbolFlags.Module ? getExportsOfModule(symbol) : symbol.exports || emptySymbols;
14941501 }
@@ -3040,7 +3047,7 @@ namespace ts {
30403047 }
30413048
30423049 function isComputedNonLiteralName(name: PropertyName): boolean {
3043- return name.kind === SyntaxKind.ComputedPropertyName && !isStringOrNumericLiteral((<ComputedPropertyName>name).expression.kind );
3050+ return name.kind === SyntaxKind.ComputedPropertyName && !isStringOrNumericLiteral((<ComputedPropertyName>name).expression);
30443051 }
30453052
30463053 function getRestType(source: Type, properties: PropertyName[], symbol: Symbol): Type {
@@ -3091,7 +3098,7 @@ namespace ts {
30913098 }
30923099 const literalMembers: PropertyName[] = [];
30933100 for (const element of pattern.elements) {
3094- if (element.kind !== SyntaxKind.OmittedExpression && !(element as BindingElement).dotDotDotToken) {
3101+ if (!(element as BindingElement).dotDotDotToken) {
30953102 literalMembers.push(element.propertyName || element.name as Identifier);
30963103 }
30973104 }
@@ -4504,6 +4511,8 @@ namespace ts {
45044511 const members: SymbolTable = createMap<Symbol>();
45054512 let stringIndexInfo: IndexInfo;
45064513 let numberIndexInfo: IndexInfo;
4514+ // Resolve upfront such that recursive references see an empty object type.
4515+ setStructuredTypeMembers(type, emptySymbols, emptyArray, emptyArray, undefined, undefined);
45074516 // In { [P in K]: T }, we refer to P as the type parameter type, K as the constraint type,
45084517 // and T as the template type.
45094518 const typeParameter = getTypeParameterFromMappedType(type);
@@ -8944,7 +8953,7 @@ namespace ts {
89448953 return type;
89458954 }
89468955
8947- function getTypeOfDestructuredProperty(type: Type, name: Identifier | LiteralExpression | ComputedPropertyName ) {
8956+ function getTypeOfDestructuredProperty(type: Type, name: PropertyName ) {
89488957 const text = getTextOfPropertyName(name);
89498958 return getTypeOfPropertyOfType(type, text) ||
89508959 isNumericLiteralName(text) && getIndexTypeOfType(type, IndexKind.Number) ||
@@ -14238,9 +14247,7 @@ namespace ts {
1423814247 }
1423914248 }
1424014249 else if (property.kind === SyntaxKind.SpreadAssignment) {
14241- if (property.expression.kind !== SyntaxKind.Identifier) {
14242- error(property.expression, Diagnostics.An_object_rest_element_must_be_an_identifier);
14243- }
14250+ checkReferenceExpression(property.expression, Diagnostics.The_target_of_an_object_rest_assignment_must_be_a_variable_or_a_property_access);
1424414251 }
1424514252 else {
1424614253 error(property, Diagnostics.Property_assignment_expected);
@@ -14761,7 +14768,7 @@ namespace ts {
1476114768 function checkDeclarationInitializer(declaration: VariableLikeDeclaration) {
1476214769 const type = checkExpressionCached(declaration.initializer);
1476314770 return getCombinedNodeFlags(declaration) & NodeFlags.Const ||
14764- getCombinedModifierFlags(declaration) & ModifierFlags.Readonly ||
14771+ getCombinedModifierFlags(declaration) & ModifierFlags.Readonly && !isParameterPropertyDeclaration(declaration) ||
1476514772 isTypeAssertion(declaration.initializer) ? type : getWidenedLiteralType(type);
1476614773 }
1476714774
@@ -19649,7 +19656,7 @@ namespace ts {
1964919656
1965019657 function isNameOfModuleOrEnumDeclaration(node: Identifier) {
1965119658 const parent = node.parent;
19652- return isModuleOrEnumDeclaration(parent) && node === parent.name;
19659+ return parent && isModuleOrEnumDeclaration(parent) && node === parent.name;
1965319660 }
1965419661
1965519662 // When resolved as an expression identifier, if the given node references an exported entity, return the declaration
0 commit comments