Merge pull request #23067 from Microsoft/fixTPReferenceInConditional

Fix type parameter reference checks in conditional types
This commit is contained in:
Anders Hejlsberg
2018-04-02 17:30:32 -07:00
committed by GitHub
6 changed files with 233 additions and 6 deletions

View File

@@ -8466,15 +8466,19 @@ namespace ts {
return result;
}
function getTopConditionalType(node: Node): ConditionalTypeNode {
let result: ConditionalTypeNode;
function isPossiblyReferencedInConditionalType(tp: TypeParameter, node: Node) {
if (isTypeParameterPossiblyReferenced(tp, node)) {
return true;
}
while (node) {
if (node.kind === SyntaxKind.ConditionalType) {
result = <ConditionalTypeNode>node;
if (isTypeParameterPossiblyReferenced(tp, (<ConditionalTypeNode>node).extendsType)) {
return true;
}
}
node = node.parent;
}
return result;
return false;
}
function getTypeFromConditionalTypeNode(node: ConditionalTypeNode): Type {
@@ -8483,8 +8487,7 @@ namespace ts {
const checkType = getTypeFromTypeNode(node.checkType);
const aliasTypeArguments = getAliasTypeArgumentsForTypeNode(node);
const allOuterTypeParameters = getOuterTypeParameters(node, /*includeThisTypes*/ true);
const topNode = getTopConditionalType(node);
const outerTypeParameters = aliasTypeArguments ? allOuterTypeParameters : filter(allOuterTypeParameters, tp => isTypeParameterPossiblyReferenced(tp, topNode));
const outerTypeParameters = aliasTypeArguments ? allOuterTypeParameters : filter(allOuterTypeParameters, tp => isPossiblyReferencedInConditionalType(tp, node));
const root: ConditionalRoot = {
node,
checkType,