diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 45f66a5e3ce..711a57effd8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -18218,10 +18218,10 @@ namespace ts { propagationType = savePropagationType; return; } - if (source.aliasSymbol && source.aliasTypeArguments && source.aliasSymbol === target.aliasSymbol) { + if (source.aliasSymbol && source.aliasTypeArguments && source.aliasSymbol === target.aliasSymbol && + inferFromTypeArguments(source.aliasTypeArguments, target.aliasTypeArguments!, getAliasVariances(source.aliasSymbol))) { // Source and target are types originating in the same generic type alias declaration. // Simply infer from source type arguments to target type arguments. - inferFromTypeArguments(source.aliasTypeArguments, target.aliasTypeArguments!, getAliasVariances(source.aliasSymbol)); return; } if (source === target && source.flags & TypeFlags.UnionOrIntersection) { @@ -18341,9 +18341,9 @@ namespace ts { } if (getObjectFlags(source) & ObjectFlags.Reference && getObjectFlags(target) & ObjectFlags.Reference && ( (source).target === (target).target || isArrayType(source) && isArrayType(target)) && - !((source).node && (target).node)) { + !((source).node && (target).node) && + inferFromTypeArguments(getTypeArguments(source), getTypeArguments(target), getVariances((source).target))) { // If source and target are references to the same generic type, infer from type arguments - inferFromTypeArguments(getTypeArguments(source), getTypeArguments(target), getVariances((source).target)); } else if (source.flags & TypeFlags.Index && target.flags & TypeFlags.Index) { contravariant = !contravariant; @@ -18463,6 +18463,9 @@ namespace ts { } function inferFromTypeArguments(sourceTypes: readonly Type[], targetTypes: readonly Type[], variances: readonly VarianceFlags[]) { + if (some(variances, variance => !!(variance & VarianceFlags.Awaited))) { + return false; + } const count = sourceTypes.length < targetTypes.length ? sourceTypes.length : targetTypes.length; for (let i = 0; i < count; i++) { if (i < variances.length && (variances[i] & VarianceFlags.VarianceMask) === VarianceFlags.Contravariant) { @@ -18475,6 +18478,7 @@ namespace ts { inferFromTypes(sourceTypes[i], targetTypes[i]); } } + return true; } function inferFromContravariantTypes(source: Type, target: Type) { @@ -18680,9 +18684,9 @@ namespace ts { function inferFromObjectTypesWorker(source: Type, target: Type) { if (getObjectFlags(source) & ObjectFlags.Reference && getObjectFlags(target) & ObjectFlags.Reference && ( - (source).target === (target).target || isArrayType(source) && isArrayType(target))) { + (source).target === (target).target || isArrayType(source) && isArrayType(target)) && + inferFromTypeArguments(getTypeArguments(source), getTypeArguments(target), getVariances((source).target))) { // If source and target are references to the same generic type, infer from type arguments - inferFromTypeArguments(getTypeArguments(source), getTypeArguments(target), getVariances((source).target)); return; } if (isGenericMappedType(source) && isGenericMappedType(target)) {