对象内部的数组解构

Adr*_*ciu 5 destructuring typescript ecmascript-6

创建一个简单的数组并在(空)对象中对其进行解构:

const foo: Array<number> = [1, 2, 3, 4];
const bar: Array<number> = {...foo};
Run Code Online (Sandbox Code Playgroud)

类型检查不应该在这里失败吗?bar对我来说看起来不像一个数组。编辑器根本没有抱怨并将其视为bar数组类型,即使我可以在运行时轻松检查它不是。

编辑

在 TypeScript 游乐场中轻松重现它。

art*_*tem 3

它看起来像是一个已知问题,因为{...foo}解构被编译为Object.assign({}, foo),并Object.assign()声明为

assign<T, U>(target: T, source: U): T & U;
Run Code Online (Sandbox Code Playgroud)

所以当第二个参数是数组时,结果与数组类型兼容。

希望当实现更好的 Object.assign 类型时它会得到修复:

我即将获得传播类型的 PR,因此当这些类型出现时,Object.assign 将更改为正确的类型:

分配(目标:T,源:U):{ ...T,...U }

如果正确实现,扩展类型不应考虑不可枚举的属性,例如length,因此您的代码将给出与以下相同的错误

const p: Array<number> = {};

// Type '{}' is not assignable to type 'number[]'.
// Property 'length' is missing in type '{}'.
Run Code Online (Sandbox Code Playgroud)