打字稿:传播类型只能从对象类型创建

时间:2018-07-05 10:47:34

标签: typescript

function foo<T extends object>(t: T): T {

  return {
    ...t    // Error: [ts] Spread types may only be created from object types.
  }
}

我知道github上有问题,但是我无法弄清楚什么是固定的,什么不是固定的,它们有2695个未解决的问题。所以我在这里发布。我正在使用最新的Typescript 2.9.2。

上面的代码不行吗?以及如何解决?

5 个答案:

答案 0 :(得分:46)

此问题在TypeScript 3.2版中已修复。参见Release Notes


目前尚不支持使用泛型类型的传播,但有关GitHub的问题是:Microsoft/TypeScript#10727

目前,您可以像type assertion @Jevgeni一样使用commented

function foo<T extends object>(t: T): T {
  return { ...(t as object) } as T;
}

或者您可以使用具有正确类型定义的Object.assign

function foo<T extends object>(t: T): T {
  return Object.assign({}, t);
}

答案 1 :(得分:7)

Typescript的3.2版修复了此问题。改善传播和休息参数处理的两个PR:

您现在可以使用npm install typescript@3.2进行尝试。

在3.2版本中,您的代码照常运行。

版本3.2已于2018年11月29日发布,您可以详细了解here

答案 2 :(得分:1)

foo((data) => {
  return {
    ...data as {}
  }
}

答案 3 :(得分:0)

此答案可能有助于解决使用角度和火炬的相同问题。

return { id: item.payload.doc.id, ...item.payload.doc.data()} as Employee

此操作将引发相同的错误。要进行修复,您必须像这样进行更改。

return { id: item.payload.doc.id, ...item.payload.doc.data() as Employee }

答案 4 :(得分:0)

如果在3.2版之后仍然出现此错误,则可能是类型错误“上游”,导致对象为unknown而不是实际对象。例如,如果您执行{ ...getData() }并且您的getData函数出现编译错误,则可以得到此错误。

因此请检查所有编译器错误,因为它可能是红色鲱鱼。