@@ -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 ) ;
@@ -2716,13 +2716,41 @@ module ts {
2716
2716
}
2717
2717
}
2718
2718
2719
- function getUnionType ( types : Type [ ] ) : Type {
2719
+ function containsAnyType ( types : Type [ ] ) {
2720
+ for ( var i = 0 ; i < types . length ; i ++ ) {
2721
+ if ( types [ i ] . flags & TypeFlags . Any ) {
2722
+ return true ;
2723
+ }
2724
+ }
2725
+ return false ;
2726
+ }
2727
+
2728
+ function removeAllButLast ( types : Type [ ] , typeToRemove : Type ) {
2729
+ var i = types . length ;
2730
+ while ( i > 0 && types . length > 1 ) {
2731
+ i -- ;
2732
+ if ( types [ i ] === typeToRemove ) {
2733
+ types . splice ( i , 1 ) ;
2734
+ }
2735
+ }
2736
+ }
2737
+
2738
+ function getUnionType ( types : Type [ ] , noSubtypeReduction ?: boolean ) : Type {
2720
2739
if ( types . length === 0 ) {
2721
2740
return emptyObjectType ;
2722
2741
}
2723
2742
var sortedTypes : Type [ ] = [ ] ;
2724
2743
addTypesToSortedSet ( sortedTypes , types ) ;
2725
- removeSubtypes ( sortedTypes ) ;
2744
+ if ( noSubtypeReduction ) {
2745
+ if ( containsAnyType ( sortedTypes ) ) {
2746
+ return anyType ;
2747
+ }
2748
+ removeAllButLast ( sortedTypes , undefinedType ) ;
2749
+ removeAllButLast ( sortedTypes , nullType ) ;
2750
+ }
2751
+ else {
2752
+ removeSubtypes ( sortedTypes ) ;
2753
+ }
2726
2754
if ( sortedTypes . length === 1 ) {
2727
2755
return sortedTypes [ 0 ] ;
2728
2756
}
@@ -2738,7 +2766,7 @@ module ts {
2738
2766
function getTypeFromUnionTypeNode ( node : UnionTypeNode ) : Type {
2739
2767
var links = getNodeLinks ( node ) ;
2740
2768
if ( ! links . resolvedType ) {
2741
- links . resolvedType = getUnionType ( map ( node . types , getTypeFromTypeNode ) ) ;
2769
+ links . resolvedType = getUnionType ( map ( node . types , getTypeFromTypeNode ) , /*noSubtypeReduction*/ true ) ;
2742
2770
}
2743
2771
return links . resolvedType ;
2744
2772
}
@@ -2956,7 +2984,7 @@ module ts {
2956
2984
return createTupleType ( instantiateList ( ( < TupleType > type ) . elementTypes , mapper , instantiateType ) ) ;
2957
2985
}
2958
2986
if ( type . flags & TypeFlags . Union ) {
2959
- return getUnionType ( instantiateList ( ( < UnionType > type ) . types , mapper , instantiateType ) ) ;
2987
+ return getUnionType ( instantiateList ( ( < UnionType > type ) . types , mapper , instantiateType ) , /*noSubtypeReduction*/ true ) ;
2960
2988
}
2961
2989
}
2962
2990
return type ;
@@ -3606,7 +3634,7 @@ module ts {
3606
3634
return forEach ( types , t => isSupertypeOfEach ( t , types ) ? t : undefined ) ;
3607
3635
}
3608
3636
3609
- function getBestCommonType ( types : Type [ ] , contextualType ? : Type ) : Type {
3637
+ function getBestCommonType ( types : Type [ ] , contextualType : Type ) : Type {
3610
3638
return contextualType && isSupertypeOfEach ( contextualType , types ) ? contextualType : getUnionType ( types ) ; }
3611
3639
3612
3640
function isTypeOfObjectLiteral ( type : Type ) : boolean {
@@ -4558,7 +4586,7 @@ module ts {
4558
4586
return createTupleType ( elementTypes ) ;
4559
4587
}
4560
4588
var contextualElementType = contextualType && ! isInferentialContext ( contextualMapper ) ? getIndexTypeOfType ( contextualType , IndexKind . Number ) : undefined ;
4561
- var elementType = elements . length || contextualElementType ? getBestCommonType ( deduplicate ( elementTypes ) , contextualElementType ) : undefinedType ;
4589
+ var elementType = elements . length || contextualElementType ? getBestCommonType ( elementTypes , contextualElementType ) : undefinedType ;
4562
4590
return createArrayType ( elementType ) ;
4563
4591
}
4564
4592
@@ -5601,7 +5629,7 @@ module ts {
5601
5629
case SyntaxKind . AmpersandAmpersandToken :
5602
5630
return rightType ;
5603
5631
case SyntaxKind . BarBarToken :
5604
- return getBestCommonType ( [ leftType , rightType ] , isInferentialContext ( contextualMapper ) ? undefined : getContextualType ( node ) ) ;
5632
+ return getUnionType ( [ leftType , rightType ] ) ;
5605
5633
case SyntaxKind . EqualsToken :
5606
5634
checkAssignmentOperator ( rightType ) ;
5607
5635
return rightType ;
@@ -5651,9 +5679,7 @@ module ts {
5651
5679
checkExpression ( node . condition ) ;
5652
5680
var type1 = checkExpression ( node . whenTrue , contextualMapper ) ;
5653
5681
var type2 = checkExpression ( node . whenFalse , contextualMapper ) ;
5654
- var contextualType = isInferentialContext ( contextualMapper ) ? undefined : getContextualType ( node ) ;
5655
- var resultType = getBestCommonType ( [ type1 , type2 ] , contextualType ) ;
5656
- return resultType ;
5682
+ return getUnionType ( [ type1 , type2 ] ) ;
5657
5683
}
5658
5684
5659
5685
function checkExpressionWithContextualType ( node : Expression , contextualType : Type , contextualMapper ?: TypeMapper ) : Type {
0 commit comments