@@ -7644,6 +7644,7 @@ namespace ts {
76447644 return type && narrowType(type, flow.expression, flow.assumeTrue);
76457645 }
76467646
7647+ <<<<<<< 6e29b517c1915580728739864d5d7f6743d7ae14
76477648 function getTypeAtFlowNodeCached(flow: FlowNode) {
76487649 const cache = getFlowTypeCache(flow);
76497650 if (!key) {
@@ -7658,6 +7659,19 @@ namespace ts {
76587659 if (flowStackNodes[i] === flow && flowStackCacheKeys[i] === key) {
76597660 return undefined;
76607661 }
7662+ =======
7663+ return narrowBasedOnMatchingProperty(type, propName);
7664+ }
7665+
7666+ function isMemberSubtype(type: Type, check: Type, selectors: string[]): boolean {
7667+ if (!selectors.length) {
7668+ return isTypeSubtypeOf(type, check);
7669+ }
7670+ const name = selectors.pop();
7671+ const childProp = getPropertyOfType(type, name);
7672+ const propType = childProp && getTypeOfSymbol(childProp);
7673+ return propType && isMemberSubtype(propType, check, selectors);
7674+ >>>>>>> improve style/names
76617675 }
76627676 // Record node and key on stack of nodes being processed.
76637677 flowStackNodes[flowStackCount] = flow;
@@ -7670,6 +7684,7 @@ namespace ts {
76707684 return cache[key] || type && (cache[key] = type);
76717685 }
76727686
7687+ <<<<<<< 6e29b517c1915580728739864d5d7f6743d7ae14
76737688 function getTypeAtFlowLabel(flow: FlowLabel) {
76747689 const antecedentTypes: Type[] = [];
76757690 for (const antecedent of flow.antecedents) {
@@ -7687,6 +7702,20 @@ namespace ts {
76877702 if (!contains(antecedentTypes, type)) {
76887703 antecedentTypes.push(type);
76897704 }
7705+ =======
7706+ function narrowBasedOnMatchingProperty(type: Type, name: string): Type {
7707+ const childProp = getPropertyOfType(type, name);
7708+ const propType = childProp && getTypeOfSymbol(childProp);
7709+ const narrowedType = propType && narrowIntrospectively(propType);
7710+
7711+ if (narrowedType && !isTypeIdenticalTo(propType, narrowedType)) {
7712+ const symbols = cloneSymbolTable(resolveStructuredTypeMembers(type as ObjectType).members);
7713+ const temp = createSymbol(childProp.flags, name);
7714+ getSymbolLinks(temp).type = narrowedType;
7715+ symbols[name] = temp;
7716+ return createAnonymousType(createSymbol(type.symbol.flags, type.symbol.name), symbols, getSignaturesOfType(type, SignatureKind.Call),
7717+ getSignaturesOfType(type, SignatureKind.Construct), getIndexTypeOfType(type, IndexKind.String), getIndexTypeOfType(type, IndexKind.Number));
7718+ >>>>>>> improve style/names
76907719 }
76917720 }
76927721 return antecedentTypes.length === 0 ? undefined :
0 commit comments