Skip to content

Object spreading restrictions are inconsistent "Spread types may only be created from object types." #30851

@vartan

Description

@vartan

TypeScript Version: 3.3.3

function unsafeSpread<T extends number>(arg: T) {
  return {...arg}; // why isn't this an error
}
let val = 1;
let spreadVal = {...val}; // but this is
let unknownVal: unknown = 1;
let unknownSpreadVal = {...unknownVal}; // and this is not

Expected behavior:
"Spread types may only be created from object types." should be thrown whenever non-objects are spread.

Actual behavior:
unknown and generics can be spread regardless

Playground Link:
https://www.typescriptlang.org/play/#src=function%20unsafeSpread%3CT%20extends%20number%3E(arg%3A%20T)%20%7B%0D%0A%20%20return%20%7B...arg%7D%3B%20%2F%2F%20why%20isn't%20this%20an%20error%0D%0A%7D%0D%0Alet%20val%20%3D%201%3B%0D%0Alet%20spreadVal%20%3D%20%7B...val%7D%3B%20%2F%2F%20but%20this%20is%0D%0Alet%20unknownVal%3A%20unknown%20%3D%201%3B%0D%0Alet%20unknownSpreadVal%20%3D%20%7B...unknownVal%7D%3B%20%2F%2F%20and%20this%20is%20not%0D%0A

Related Issues:

did not find any in the first couple pages when searching

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScript

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions