Skip to content

Commit a537cb3

Browse files
committed
Merge pull request #919 from Microsoft/optionalPropertySubtyping
Require optional properties to be present in subtypes
2 parents 152a940 + ff20df7 commit a537cb3

16 files changed

+1666
-935
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3372,7 +3372,7 @@ module ts {
33723372
var sourceProp = getPropertyOfApparentType(<ApparentType>source, targetProp.name);
33733373
if (sourceProp !== targetProp) {
33743374
if (!sourceProp) {
3375-
if (!isOptionalProperty(targetProp)) {
3375+
if (relation === subtypeRelation || !isOptionalProperty(targetProp)) {
33763376
if (reportErrors) {
33773377
reportError(Diagnostics.Property_0_is_missing_in_type_1, symbolToString(targetProp), typeToString(source));
33783378
}
@@ -3661,10 +3661,6 @@ module ts {
36613661
return forEach(types, t => isSupertypeOfEach(t, types) ? t : undefined);
36623662
}
36633663

3664-
function getBestCommonType(types: Type[], contextualType: Type): Type {
3665-
return contextualType && isSupertypeOfEach(contextualType, types) ? contextualType : getUnionType(types);
3666-
}
3667-
36683664
function isTypeOfObjectLiteral(type: Type): boolean {
36693665
return (type.flags & TypeFlags.Anonymous) && type.symbol && (type.symbol.flags & SymbolFlags.ObjectLiteral) ? true : false;
36703666
}
@@ -5751,7 +5747,7 @@ module ts {
57515747
case SyntaxKind.GreaterThanToken:
57525748
case SyntaxKind.LessThanEqualsToken:
57535749
case SyntaxKind.GreaterThanEqualsToken:
5754-
if (!isTypeSubtypeOf(leftType, rightType) && !isTypeSubtypeOf(rightType, leftType)) {
5750+
if (!isTypeAssignableTo(leftType, rightType) && !isTypeAssignableTo(rightType, leftType)) {
57555751
reportOperatorError();
57565752
}
57575753
return booleanType;

src/compiler/emitter.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2868,7 +2868,7 @@ module ts {
28682868
}
28692869
return {
28702870
diagnosticMessage: diagnosticMessage,
2871-
errorNode: node.parameters[0],
2871+
errorNode: <Node>node.parameters[0],
28722872
typeName: node.name
28732873
};
28742874
}
@@ -2889,7 +2889,7 @@ module ts {
28892889
}
28902890
return {
28912891
diagnosticMessage: diagnosticMessage,
2892-
errorNode: node.name,
2892+
errorNode: <Node>node.name,
28932893
typeName: undefined
28942894
};
28952895
}

tests/baselines/reference/arrayLiteralWithMultipleBestCommonTypes.types

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,20 @@ var c: { x: number; a?: number };
1717
>a : number
1818

1919
var as = [a, b]; // { x: number; y?: number };[]
20-
>as : { x: number; y?: number; }[]
21-
>[a, b] : { x: number; y?: number; }[]
20+
>as : ({ x: number; y?: number; } | { x: number; z?: number; })[]
21+
>[a, b] : ({ x: number; y?: number; } | { x: number; z?: number; })[]
2222
>a : { x: number; y?: number; }
2323
>b : { x: number; z?: number; }
2424

2525
var bs = [b, a]; // { x: number; z?: number };[]
26-
>bs : { x: number; y?: number; }[]
27-
>[b, a] : { x: number; y?: number; }[]
26+
>bs : ({ x: number; y?: number; } | { x: number; z?: number; })[]
27+
>[b, a] : ({ x: number; y?: number; } | { x: number; z?: number; })[]
2828
>b : { x: number; z?: number; }
2929
>a : { x: number; y?: number; }
3030

3131
var cs = [a, b, c]; // { x: number; y?: number };[]
32-
>cs : { x: number; y?: number; }[]
33-
>[a, b, c] : { x: number; y?: number; }[]
32+
>cs : ({ x: number; y?: number; } | { x: number; z?: number; } | { x: number; a?: number; })[]
33+
>[a, b, c] : ({ x: number; y?: number; } | { x: number; z?: number; } | { x: number; a?: number; })[]
3434
>a : { x: number; y?: number; }
3535
>b : { x: number; z?: number; }
3636
>c : { x: number; a?: number; }
@@ -54,8 +54,8 @@ var es = [(x: string) => 2, (x: Object) => 1]; // { (x:string) => number }[]
5454
>Object : Object
5555

5656
var fs = [(a: { x: number; y?: number }) => 1, (b: { x: number; z?: number }) => 2]; // (a: { x: number; y?: number }) => number[]
57-
>fs : ((a: { x: number; y?: number; }) => number)[]
58-
>[(a: { x: number; y?: number }) => 1, (b: { x: number; z?: number }) => 2] : ((a: { x: number; y?: number; }) => number)[]
57+
>fs : (((a: { x: number; y?: number; }) => number) | ((b: { x: number; z?: number; }) => number))[]
58+
>[(a: { x: number; y?: number }) => 1, (b: { x: number; z?: number }) => 2] : (((a: { x: number; y?: number; }) => number) | ((b: { x: number; z?: number; }) => number))[]
5959
>(a: { x: number; y?: number }) => 1 : (a: { x: number; y?: number; }) => number
6060
>a : { x: number; y?: number; }
6161
>x : number
@@ -66,8 +66,8 @@ var fs = [(a: { x: number; y?: number }) => 1, (b: { x: number; z?: number }) =>
6666
>z : number
6767

6868
var gs = [(b: { x: number; z?: number }) => 2, (a: { x: number; y?: number }) => 1]; // (b: { x: number; z?: number }) => number[]
69-
>gs : ((b: { x: number; z?: number; }) => number)[]
70-
>[(b: { x: number; z?: number }) => 2, (a: { x: number; y?: number }) => 1] : ((b: { x: number; z?: number; }) => number)[]
69+
>gs : (((b: { x: number; z?: number; }) => number) | ((a: { x: number; y?: number; }) => number))[]
70+
>[(b: { x: number; z?: number }) => 2, (a: { x: number; y?: number }) => 1] : (((b: { x: number; z?: number; }) => number) | ((a: { x: number; y?: number; }) => number))[]
7171
>(b: { x: number; z?: number }) => 2 : (b: { x: number; z?: number; }) => number
7272
>b : { x: number; z?: number; }
7373
>x : number

tests/baselines/reference/bestCommonTypeOfConditionalExpressions.types

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,14 @@ var r3 = true ? 1 : {};
4848
>{} : {}
4949

5050
var r4 = true ? a : b; // typeof a
51-
>r4 : { x: number; y?: number; }
52-
>true ? a : b : { x: number; y?: number; }
51+
>r4 : { x: number; y?: number; } | { x: number; z?: number; }
52+
>true ? a : b : { x: number; y?: number; } | { x: number; z?: number; }
5353
>a : { x: number; y?: number; }
5454
>b : { x: number; z?: number; }
5555

5656
var r5 = true ? b : a; // typeof b
57-
>r5 : { x: number; y?: number; }
58-
>true ? b : a : { x: number; y?: number; }
57+
>r5 : { x: number; y?: number; } | { x: number; z?: number; }
58+
>true ? b : a : { x: number; y?: number; } | { x: number; z?: number; }
5959
>b : { x: number; z?: number; }
6060
>a : { x: number; y?: number; }
6161

tests/baselines/reference/comparisonOperatorWithSubtypeObjectOnInstantiatedCallSignature.errors.txt

Lines changed: 0 additions & 215 deletions
This file was deleted.

0 commit comments

Comments
 (0)