Merge pull request #14467 from kpreisser/fix14269

Allow the right-hand side of an 'in' expression to be of non-primitive object type
This commit is contained in:
Daniel Rosenwasser 2017-03-30 22:51:45 -07:00 committed by GitHub
commit 0459987673
5 changed files with 69 additions and 1 deletions

View File

@ -16306,7 +16306,7 @@ namespace ts {
if (!(isTypeComparableTo(leftType, stringType) || isTypeOfKind(leftType, TypeFlags.NumberLike | TypeFlags.ESSymbol))) {
error(left, Diagnostics.The_left_hand_side_of_an_in_expression_must_be_of_type_any_string_number_or_symbol);
}
if (!isTypeAnyOrAllConstituentTypesHaveKind(rightType, TypeFlags.Object | TypeFlags.TypeVariable)) {
if (!isTypeAnyOrAllConstituentTypesHaveKind(rightType, TypeFlags.Object | TypeFlags.TypeVariable | TypeFlags.NonPrimitive)) {
error(right, Diagnostics.The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter);
}
return booleanType;

View File

@ -0,0 +1,17 @@
//// [nonPrimitiveRhsSideOfInExpression.ts]
let o: object = {};
function f(): object {
return {};
}
const b1 = "foo" in o;
const b2 = "bar" in f();
//// [nonPrimitiveRhsSideOfInExpression.js]
var o = {};
function f() {
return {};
}
var b1 = "foo" in o;
var b2 = "bar" in f();

View File

@ -0,0 +1,18 @@
=== tests/cases/conformance/types/nonPrimitive/nonPrimitiveRhsSideOfInExpression.ts ===
let o: object = {};
>o : Symbol(o, Decl(nonPrimitiveRhsSideOfInExpression.ts, 0, 3))
function f(): object {
>f : Symbol(f, Decl(nonPrimitiveRhsSideOfInExpression.ts, 0, 19))
return {};
}
const b1 = "foo" in o;
>b1 : Symbol(b1, Decl(nonPrimitiveRhsSideOfInExpression.ts, 6, 5))
>o : Symbol(o, Decl(nonPrimitiveRhsSideOfInExpression.ts, 0, 3))
const b2 = "bar" in f();
>b2 : Symbol(b2, Decl(nonPrimitiveRhsSideOfInExpression.ts, 7, 5))
>f : Symbol(f, Decl(nonPrimitiveRhsSideOfInExpression.ts, 0, 19))

View File

@ -0,0 +1,25 @@
=== tests/cases/conformance/types/nonPrimitive/nonPrimitiveRhsSideOfInExpression.ts ===
let o: object = {};
>o : object
>{} : {}
function f(): object {
>f : () => object
return {};
>{} : {}
}
const b1 = "foo" in o;
>b1 : boolean
>"foo" in o : boolean
>"foo" : "foo"
>o : object
const b2 = "bar" in f();
>b2 : boolean
>"bar" in f() : boolean
>"bar" : "bar"
>f() : object
>f : () => object

View File

@ -0,0 +1,8 @@
let o: object = {};
function f(): object {
return {};
}
const b1 = "foo" in o;
const b2 = "bar" in f();