@@ -4275,7 +4275,7 @@ namespace ts {
4275
4275
return createConditionalTypeNode(checkTypeNode, extendsTypeNode, trueTypeNode, falseTypeNode);
4276
4276
}
4277
4277
if (type.flags & TypeFlags.Substitution) {
4278
- return typeToTypeNodeHelper((<SubstitutionType>type).typeVariable , context);
4278
+ return typeToTypeNodeHelper((<SubstitutionType>type).baseType , context);
4279
4279
}
4280
4280
4281
4281
return Debug.fail("Should be unreachable.");
@@ -11315,17 +11315,15 @@ namespace ts {
11315
11315
}
11316
11316
symbol = getExpandoSymbol(symbol) || symbol;
11317
11317
if (symbol.flags & (SymbolFlags.Class | SymbolFlags.Interface)) {
11318
- return getTypeFromClassOrInterfaceReference(node, symbol);
11318
+ return getConditionalFlowTypeOfType( getTypeFromClassOrInterfaceReference(node, symbol), node );
11319
11319
}
11320
11320
if (symbol.flags & SymbolFlags.TypeAlias) {
11321
- return getTypeFromTypeAliasReference(node, symbol);
11321
+ return getConditionalFlowTypeOfType( getTypeFromTypeAliasReference(node, symbol), node );
11322
11322
}
11323
11323
// Get type from reference to named type that cannot be generic (enum or type parameter)
11324
11324
const res = tryGetDeclaredTypeOfSymbol(symbol);
11325
11325
if (res) {
11326
- return checkNoTypeArguments(node, symbol) ?
11327
- res.flags & TypeFlags.TypeParameter ? getConstrainedTypeVariable(<TypeParameter>res, node) : getRegularTypeOfLiteralType(res) :
11328
- errorType;
11326
+ return checkNoTypeArguments(node, symbol) ? getConditionalFlowTypeOfType(getRegularTypeOfLiteralType(res), node) : errorType;
11329
11327
}
11330
11328
if (symbol.flags & SymbolFlags.Value && isJSDocTypeReference(node)) {
11331
11329
const jsdocType = getTypeFromJSDocValueReference(node, symbol);
@@ -11335,7 +11333,7 @@ namespace ts {
11335
11333
else {
11336
11334
// Resolve the type reference as a Type for the purpose of reporting errors.
11337
11335
resolveTypeReferenceName(getTypeReferenceName(node), SymbolFlags.Type);
11338
- return getTypeOfSymbol(symbol);
11336
+ return getConditionalFlowTypeOfType( getTypeOfSymbol(symbol), node );
11339
11337
}
11340
11338
}
11341
11339
return errorType;
@@ -11373,17 +11371,17 @@ namespace ts {
11373
11371
return links.resolvedJSDocType;
11374
11372
}
11375
11373
11376
- function getSubstitutionType(typeVariable: TypeVariable , substitute: Type) {
11377
- if (substitute.flags & TypeFlags.AnyOrUnknown || substitute === typeVariable ) {
11378
- return typeVariable ;
11374
+ function getSubstitutionType(baseType: Type , substitute: Type) {
11375
+ if (substitute.flags & TypeFlags.AnyOrUnknown || substitute === baseType ) {
11376
+ return baseType ;
11379
11377
}
11380
- const id = `${getTypeId(typeVariable )}>${getTypeId(substitute)}`;
11378
+ const id = `${getTypeId(baseType )}>${getTypeId(substitute)}`;
11381
11379
const cached = substitutionTypes.get(id);
11382
11380
if (cached) {
11383
11381
return cached;
11384
11382
}
11385
11383
const result = <SubstitutionType>createType(TypeFlags.Substitution);
11386
- result.typeVariable = typeVariable ;
11384
+ result.baseType = baseType ;
11387
11385
result.substitute = substitute;
11388
11386
substitutionTypes.set(id, result);
11389
11387
return result;
@@ -11393,25 +11391,25 @@ namespace ts {
11393
11391
return node.kind === SyntaxKind.TupleType && (<TupleTypeNode>node).elementTypes.length === 1;
11394
11392
}
11395
11393
11396
- function getImpliedConstraint(typeVariable: TypeVariable , checkNode: TypeNode, extendsNode: TypeNode): Type | undefined {
11397
- return isUnaryTupleTypeNode(checkNode) && isUnaryTupleTypeNode(extendsNode) ? getImpliedConstraint(typeVariable , (<TupleTypeNode>checkNode).elementTypes[0], (<TupleTypeNode>extendsNode).elementTypes[0]) :
11398
- getActualTypeVariable(getTypeFromTypeNode(checkNode)) === typeVariable ? getTypeFromTypeNode(extendsNode) :
11394
+ function getImpliedConstraint(type: Type , checkNode: TypeNode, extendsNode: TypeNode): Type | undefined {
11395
+ return isUnaryTupleTypeNode(checkNode) && isUnaryTupleTypeNode(extendsNode) ? getImpliedConstraint(type , (<TupleTypeNode>checkNode).elementTypes[0], (<TupleTypeNode>extendsNode).elementTypes[0]) :
11396
+ getActualTypeVariable(getTypeFromTypeNode(checkNode)) === type ? getTypeFromTypeNode(extendsNode) :
11399
11397
undefined;
11400
11398
}
11401
11399
11402
- function getConstrainedTypeVariable(typeVariable: TypeVariable , node: Node) {
11400
+ function getConditionalFlowTypeOfType(type: Type , node: Node) {
11403
11401
let constraints: Type[] | undefined;
11404
11402
while (node && !isStatement(node) && node.kind !== SyntaxKind.JSDocComment) {
11405
11403
const parent = node.parent;
11406
11404
if (parent.kind === SyntaxKind.ConditionalType && node === (<ConditionalTypeNode>parent).trueType) {
11407
- const constraint = getImpliedConstraint(typeVariable , (<ConditionalTypeNode>parent).checkType, (<ConditionalTypeNode>parent).extendsType);
11405
+ const constraint = getImpliedConstraint(type , (<ConditionalTypeNode>parent).checkType, (<ConditionalTypeNode>parent).extendsType);
11408
11406
if (constraint) {
11409
11407
constraints = append(constraints, constraint);
11410
11408
}
11411
11409
}
11412
11410
node = parent;
11413
11411
}
11414
- return constraints ? getSubstitutionType(typeVariable , getIntersectionType(append(constraints, typeVariable ))) : typeVariable ;
11412
+ return constraints ? getSubstitutionType(type , getIntersectionType(append(constraints, type ))) : type ;
11415
11413
}
11416
11414
11417
11415
function isJSDocTypeReference(node: Node): node is TypeReferenceNode {
@@ -12854,7 +12852,7 @@ namespace ts {
12854
12852
links.resolvedType = resolved.flags & TypeFlags.IndexedAccess &&
12855
12853
(<IndexedAccessType>resolved).objectType === objectType &&
12856
12854
(<IndexedAccessType>resolved).indexType === indexType ?
12857
- getConstrainedTypeVariable(<IndexedAccessType> resolved, node) : resolved;
12855
+ getConditionalFlowTypeOfType( resolved, node) : resolved;
12858
12856
}
12859
12857
return links.resolvedType;
12860
12858
}
@@ -12876,7 +12874,7 @@ namespace ts {
12876
12874
12877
12875
function getActualTypeVariable(type: Type): Type {
12878
12876
if (type.flags & TypeFlags.Substitution) {
12879
- return (<SubstitutionType>type).typeVariable ;
12877
+ return (<SubstitutionType>type).baseType ;
12880
12878
}
12881
12879
if (type.flags & TypeFlags.IndexedAccess && (
12882
12880
(<IndexedAccessType>type).objectType.flags & TypeFlags.Substitution ||
@@ -12984,7 +12982,7 @@ namespace ts {
12984
12982
node,
12985
12983
checkType,
12986
12984
extendsType: getTypeFromTypeNode(node.extendsType),
12987
- trueType: getTypeFromTypeNode(node.trueType),
12985
+ trueType: getConditionalFlowTypeOfType( getTypeFromTypeNode(node.trueType), node.trueType),
12988
12986
falseType: getTypeFromTypeNode(node.falseType),
12989
12987
isDistributive: !!(checkType.flags & TypeFlags.TypeParameter),
12990
12988
inferTypeParameters: getInferTypeParameters(node),
@@ -13959,7 +13957,7 @@ namespace ts {
13959
13957
return getConditionalTypeInstantiation(<ConditionalType>type, combineTypeMappers((<ConditionalType>type).mapper, mapper));
13960
13958
}
13961
13959
if (flags & TypeFlags.Substitution) {
13962
- const maybeVariable = instantiateType((<SubstitutionType>type).typeVariable , mapper);
13960
+ const maybeVariable = instantiateType((<SubstitutionType>type).baseType , mapper);
13963
13961
if (maybeVariable.flags & TypeFlags.TypeVariable) {
13964
13962
return getSubstitutionType(maybeVariable as TypeVariable, instantiateType((<SubstitutionType>type).substitute, mapper));
13965
13963
}
@@ -14968,7 +14966,7 @@ namespace ts {
14968
14966
const t = isFreshLiteralType(type) ? (<FreshableType>type).regularType :
14969
14967
getObjectFlags(type) & ObjectFlags.Reference && (<TypeReference>type).node ? createTypeReference((<TypeReference>type).target, getTypeArguments(<TypeReference>type)) :
14970
14968
type.flags & TypeFlags.UnionOrIntersection ? getReducedType(type) :
14971
- type.flags & TypeFlags.Substitution ? writing ? (<SubstitutionType>type).typeVariable : (<SubstitutionType>type).substitute :
14969
+ type.flags & TypeFlags.Substitution ? writing ? (<SubstitutionType>type).baseType : (<SubstitutionType>type).substitute :
14972
14970
type.flags & TypeFlags.Simplifiable ? getSimplifiedType(type, writing) :
14973
14971
type;
14974
14972
if (t === type) break;
0 commit comments