Skip to content

intersection depth and non strict merge/Object.assign #10532

Closed
@AlexGalays

Description

@AlexGalays

TypeScript Version: 1.8.0 and 2.0.0 beta

Code

const obj = Object.assign({}, { a: 'IamAString' }, { a: 33 })

Expected behavior:
We need a stricter behavior when we want to transform an existing object in a way that respect its type. Object.assign has a broader scope that this alone, but if one were to write his own merge function that used an intersection of types as the result, the same would happen.

Given a source object of type T and an update of type U, perhaps what's missing is being able to express the constraint "U is a sub/partial type of T"; Writing T extends U is too strong a constraint; for instance if the source object T has an optional property, we can never update it as { prop?: string } is not a valid sub type of { prop: string }

Actual behavior:
The compiler won't complain even though the second object's a key has an incompatible type with the first object's a key. T & U also intersects nested properties resulting in a lot of subsequent silent errors (when reading properties of a now too broad type) and strange type combinations (string & number ?_?)

Metadata

Metadata

Assignees

Labels

SuggestionAn idea for TypeScript

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions