From adefdc79538d171435ddb8a37f5a543556803495 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Tue, 18 Apr 2017 14:56:11 -0700 Subject: [PATCH 1/2] Unknown properties are assignable to Object unions For the last week or so they have been treated as excess properties when assigning to a union type containing Object, but not when assigning directly to Object type. --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 353356c208b..c0e3c490831 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8708,7 +8708,7 @@ namespace ts { if (maybeTypeOfKind(target, TypeFlags.Object) && !(getObjectFlags(target) & ObjectFlags.ObjectLiteralPatternWithComputedProperties)) { const isComparingJsxAttributes = !!(source.flags & TypeFlags.JsxAttributes); if ((relation === assignableRelation || relation === comparableRelation) && - (target === globalObjectType || (!isComparingJsxAttributes && isEmptyObjectType(target)))) { + (isTypeSubsetOf(globalObjectType, target) || (!isComparingJsxAttributes && isEmptyObjectType(target)))) { return false; } for (const prop of getPropertiesOfObjectType(source)) { From 8ab22217c133abb805cd4df18b9e5848766e9582 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Tue, 18 Apr 2017 14:58:27 -0700 Subject: [PATCH 2/2] Test:Unknown properties are assignable to Object in union Add test and accept baselines --- ...unknownPropertiesAreAssignableToObjectUnion.js | 8 ++++++++ ...wnPropertiesAreAssignableToObjectUnion.symbols | 11 +++++++++++ ...nownPropertiesAreAssignableToObjectUnion.types | 15 +++++++++++++++ ...unknownPropertiesAreAssignableToObjectUnion.ts | 3 +++ 4 files changed, 37 insertions(+) create mode 100644 tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.js create mode 100644 tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.symbols create mode 100644 tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.types create mode 100644 tests/cases/compiler/unknownPropertiesAreAssignableToObjectUnion.ts diff --git a/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.js b/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.js new file mode 100644 index 00000000000..7140f13cb7b --- /dev/null +++ b/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.js @@ -0,0 +1,8 @@ +//// [unknownPropertiesAreAssignableToObjectUnion.ts] +const x: Object | string = { x: 0 }; +const y: Object | undefined = { x: 0 }; + + +//// [unknownPropertiesAreAssignableToObjectUnion.js] +var x = { x: 0 }; +var y = { x: 0 }; diff --git a/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.symbols b/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.symbols new file mode 100644 index 00000000000..f9c0b09c987 --- /dev/null +++ b/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.symbols @@ -0,0 +1,11 @@ +=== tests/cases/compiler/unknownPropertiesAreAssignableToObjectUnion.ts === +const x: Object | string = { x: 0 }; +>x : Symbol(x, Decl(unknownPropertiesAreAssignableToObjectUnion.ts, 0, 5)) +>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(unknownPropertiesAreAssignableToObjectUnion.ts, 0, 28)) + +const y: Object | undefined = { x: 0 }; +>y : Symbol(y, Decl(unknownPropertiesAreAssignableToObjectUnion.ts, 1, 5)) +>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(unknownPropertiesAreAssignableToObjectUnion.ts, 1, 31)) + diff --git a/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.types b/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.types new file mode 100644 index 00000000000..d242cb8805c --- /dev/null +++ b/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.types @@ -0,0 +1,15 @@ +=== tests/cases/compiler/unknownPropertiesAreAssignableToObjectUnion.ts === +const x: Object | string = { x: 0 }; +>x : string | Object +>Object : Object +>{ x: 0 } : { x: number; } +>x : number +>0 : 0 + +const y: Object | undefined = { x: 0 }; +>y : Object | undefined +>Object : Object +>{ x: 0 } : { x: number; } +>x : number +>0 : 0 + diff --git a/tests/cases/compiler/unknownPropertiesAreAssignableToObjectUnion.ts b/tests/cases/compiler/unknownPropertiesAreAssignableToObjectUnion.ts new file mode 100644 index 00000000000..eb4209509de --- /dev/null +++ b/tests/cases/compiler/unknownPropertiesAreAssignableToObjectUnion.ts @@ -0,0 +1,3 @@ +// @strictNullChecks: true +const x: Object | string = { x: 0 }; +const y: Object | undefined = { x: 0 };