@@ -4937,6 +4937,10 @@ namespace ts {
4937
4937
return type.resolvedApparentType || (type.resolvedApparentType = getTypeWithThisArgument(type, type));
4938
4938
}
4939
4939
4940
+ function getApparentTypeOfReturnType(type: ReturnType) {
4941
+ return type.resolvedApparentType || (type.resolvedApparentType = getReturnType(getApparentType(type.type)));
4942
+ }
4943
+
4940
4944
/**
4941
4945
* For a type parameter, return the base constraint of the type parameter. For the string, number,
4942
4946
* boolean, and symbol primitive types, return the corresponding object types. Otherwise return the
@@ -4945,6 +4949,7 @@ namespace ts {
4945
4949
function getApparentType(type: Type): Type {
4946
4950
const t = type.flags & TypeFlags.TypeVariable ? getBaseConstraintOfType(<TypeVariable>type) || emptyObjectType : type;
4947
4951
return t.flags & TypeFlags.Intersection ? getApparentTypeOfIntersectionType(<IntersectionType>t) :
4952
+ t.flags & TypeFlags.Return ? getApparentTypeOfReturnType(<ReturnType>t) :
4948
4953
t.flags & TypeFlags.StringLike ? globalStringType :
4949
4954
t.flags & TypeFlags.NumberLike ? globalNumberType :
4950
4955
t.flags & TypeFlags.BooleanLike ? globalBooleanType :
@@ -6188,6 +6193,29 @@ namespace ts {
6188
6193
return links.resolvedType;
6189
6194
}
6190
6195
6196
+ function getTypeFromReturnOperatorNode(node: ReturnOperatorNode) {
6197
+ const links = getNodeLinks(node);
6198
+ if (!links.resolvedType) {
6199
+ links.resolvedType = getReturnType(getTypeFromTypeNode(node.type));
6200
+ }
6201
+ return links.resolvedType;
6202
+ }
6203
+
6204
+ function getReturnType(type: Type): Type {
6205
+ if (maybeTypeOfKind(type, TypeFlags.TypeVariable)) {
6206
+ return getReturnTypeForGenericType(type as TypeVariable | UnionOrIntersectionType);
6207
+ }
6208
+ return getUnionType(map(getSignaturesOfType(type, SignatureKind.Call), getReturnTypeOfSignature));
6209
+ }
6210
+
6211
+ function getReturnTypeForGenericType(type: TypeVariable | UnionOrIntersectionType): Type {
6212
+ if (!type.resolvedReturnType) {
6213
+ type.resolvedReturnType = <ReturnType>createType(TypeFlags.Return);
6214
+ type.resolvedReturnType.type = type;
6215
+ }
6216
+ return type.resolvedReturnType;
6217
+ }
6218
+
6191
6219
function createIndexedAccessType(objectType: Type, indexType: Type) {
6192
6220
const type = <IndexedAccessType>createType(TypeFlags.IndexedAccess);
6193
6221
type.objectType = objectType;
@@ -6595,7 +6623,9 @@ namespace ts {
6595
6623
case SyntaxKind.JSDocFunctionType:
6596
6624
return getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node);
6597
6625
case SyntaxKind.TypeOperator:
6598
- return getTypeFromTypeOperatorNode(<TypeOperatorNode>node);
6626
+ return getTypeFromTypeOperatorNode(node as TypeOperatorNode);
6627
+ case SyntaxKind.ReturnOperator:
6628
+ return getTypeFromReturnOperatorNode(node as ReturnOperatorNode);
6599
6629
case SyntaxKind.IndexedAccessType:
6600
6630
return getTypeFromIndexedAccessTypeNode(<IndexedAccessTypeNode>node);
6601
6631
case SyntaxKind.MappedType:
@@ -6962,6 +6992,9 @@ namespace ts {
6962
6992
if (type.flags & TypeFlags.Index) {
6963
6993
return getIndexType(instantiateType((<IndexType>type).type, mapper));
6964
6994
}
6995
+ if (type.flags & TypeFlags.Return) {
6996
+ return getReturnType(instantiateType((<ReturnType>type).type, mapper));
6997
+ }
6965
6998
if (type.flags & TypeFlags.IndexedAccess) {
6966
6999
return getIndexedAccessType(instantiateType((<IndexedAccessType>type).objectType, mapper), instantiateType((<IndexedAccessType>type).indexType, mapper));
6967
7000
}
0 commit comments