@@ -2066,7 +2066,7 @@ module ts {
2066
2066
}
2067
2067
2068
2068
function resolveTupleTypeMembers ( type : TupleType ) {
2069
- var arrayType = resolveObjectTypeMembers ( createArrayType ( getBestCommonType ( type . elementTypes ) ) ) ;
2069
+ var arrayType = resolveObjectTypeMembers ( createArrayType ( getUnionType ( type . elementTypes ) ) ) ;
2070
2070
var members = createTupleTypeMemberSymbols ( type . elementTypes ) ;
2071
2071
addInheritedMembers ( members , arrayType . properties ) ;
2072
2072
setObjectTypeMembers ( type , members , arrayType . callSignatures , arrayType . constructSignatures , arrayType . stringIndexType , arrayType . numberIndexType ) ;
@@ -2724,13 +2724,41 @@ module ts {
2724
2724
}
2725
2725
}
2726
2726
2727
- function getUnionType ( types : Type [ ] ) : Type {
2727
+ function containsAnyType ( types : Type [ ] ) {
2728
+ for ( var i = 0 ; i < types . length ; i ++ ) {
2729
+ if ( types [ i ] . flags & TypeFlags . Any ) {
2730
+ return true ;
2731
+ }
2732
+ }
2733
+ return false ;
2734
+ }
2735
+
2736
+ function removeAllButLast ( types : Type [ ] , typeToRemove : Type ) {
2737
+ var i = types . length ;
2738
+ while ( i > 0 && types . length > 1 ) {
2739
+ i -- ;
2740
+ if ( types [ i ] === typeToRemove ) {
2741
+ types . splice ( i , 1 ) ;
2742
+ }
2743
+ }
2744
+ }
2745
+
2746
+ function getUnionType ( types : Type [ ] , noSubtypeReduction ?: boolean ) : Type {
2728
2747
if ( types . length === 0 ) {
2729
2748
return emptyObjectType ;
2730
2749
}
2731
2750
var sortedTypes : Type [ ] = [ ] ;
2732
2751
addTypesToSortedSet ( sortedTypes , types ) ;
2733
- removeSubtypes ( sortedTypes ) ;
2752
+ if ( noSubtypeReduction ) {
2753
+ if ( containsAnyType ( sortedTypes ) ) {
2754
+ return anyType ;
2755
+ }
2756
+ removeAllButLast ( sortedTypes , undefinedType ) ;
2757
+ removeAllButLast ( sortedTypes , nullType ) ;
2758
+ }
2759
+ else {
2760
+ removeSubtypes ( sortedTypes ) ;
2761
+ }
2734
2762
if ( sortedTypes . length === 1 ) {
2735
2763
return sortedTypes [ 0 ] ;
2736
2764
}
@@ -2746,7 +2774,7 @@ module ts {
2746
2774
function getTypeFromUnionTypeNode ( node : UnionTypeNode ) : Type {
2747
2775
var links = getNodeLinks ( node ) ;
2748
2776
if ( ! links . resolvedType ) {
2749
- links . resolvedType = getUnionType ( map ( node . types , getTypeFromTypeNode ) ) ;
2777
+ links . resolvedType = getUnionType ( map ( node . types , getTypeFromTypeNode ) , /*noSubtypeReduction*/ true ) ;
2750
2778
}
2751
2779
return links . resolvedType ;
2752
2780
}
@@ -2964,7 +2992,7 @@ module ts {
2964
2992
return createTupleType ( instantiateList ( ( < TupleType > type ) . elementTypes , mapper , instantiateType ) ) ;
2965
2993
}
2966
2994
if ( type . flags & TypeFlags . Union ) {
2967
- return getUnionType ( instantiateList ( ( < UnionType > type ) . types , mapper , instantiateType ) ) ;
2995
+ return getUnionType ( instantiateList ( ( < UnionType > type ) . types , mapper , instantiateType ) , /*noSubtypeReduction*/ true ) ;
2968
2996
}
2969
2997
}
2970
2998
return type ;
@@ -3614,7 +3642,7 @@ module ts {
3614
3642
return forEach ( types , t => isSupertypeOfEach ( t , types ) ? t : undefined ) ;
3615
3643
}
3616
3644
3617
- function getBestCommonType ( types : Type [ ] , contextualType ? : Type ) : Type {
3645
+ function getBestCommonType ( types : Type [ ] , contextualType : Type ) : Type {
3618
3646
return contextualType && isSupertypeOfEach ( contextualType , types ) ? contextualType : getUnionType ( types ) ;
3619
3647
}
3620
3648
@@ -4567,7 +4595,7 @@ module ts {
4567
4595
return createTupleType ( elementTypes ) ;
4568
4596
}
4569
4597
var contextualElementType = contextualType && ! isInferentialContext ( contextualMapper ) ? getIndexTypeOfType ( contextualType , IndexKind . Number ) : undefined ;
4570
- var elementType = elements . length || contextualElementType ? getBestCommonType ( deduplicate ( elementTypes ) , contextualElementType ) : undefinedType ;
4598
+ var elementType = elements . length || contextualElementType ? getBestCommonType ( elementTypes , contextualElementType ) : undefinedType ;
4571
4599
return createArrayType ( elementType ) ;
4572
4600
}
4573
4601
@@ -5610,7 +5638,7 @@ module ts {
5610
5638
case SyntaxKind . AmpersandAmpersandToken :
5611
5639
return rightType ;
5612
5640
case SyntaxKind . BarBarToken :
5613
- return getBestCommonType ( [ leftType , rightType ] , isInferentialContext ( contextualMapper ) ? undefined : getContextualType ( node ) ) ;
5641
+ return getUnionType ( [ leftType , rightType ] ) ;
5614
5642
case SyntaxKind . EqualsToken :
5615
5643
checkAssignmentOperator ( rightType ) ;
5616
5644
return rightType ;
@@ -5660,9 +5688,7 @@ module ts {
5660
5688
checkExpression ( node . condition ) ;
5661
5689
var type1 = checkExpression ( node . whenTrue , contextualMapper ) ;
5662
5690
var type2 = checkExpression ( node . whenFalse , contextualMapper ) ;
5663
- var contextualType = isInferentialContext ( contextualMapper ) ? undefined : getContextualType ( node ) ;
5664
- var resultType = getBestCommonType ( [ type1 , type2 ] , contextualType ) ;
5665
- return resultType ;
5691
+ return getUnionType ( [ type1 , type2 ] ) ;
5666
5692
}
5667
5693
5668
5694
function checkExpressionWithContextualType ( node : Expression , contextualType : Type , contextualMapper ?: TypeMapper ) : Type {
0 commit comments