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。
上面的代码不行吗?以及如何解决?
答案 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
函数出现编译错误,则可以得到此错误。
因此请检查所有编译器错误,因为它可能是红色鲱鱼。