Typescript:只能从对象类型创建排列类型 函数foo(t:t):t{ 返回{ …t//错误:[ts]只能从对象类型创建排列类型。 } }

Typescript:只能从对象类型创建排列类型 函数foo(t:t):t{ 返回{ …t//错误:[ts]只能从对象类型创建排列类型。 } },typescript,Typescript,我知道github上存在一些问题,但我不知道什么是固定的,什么不是,他们有2695个未解决的问题。所以我在这里发帖。我正在使用最新的Typescript 2.9.2 上述代码是否应该不起作用?如果可能的话,我如何修复它?这在TypeScript 3.2版中已修复。看 看起来还不支持泛型类型的spread,但它存在一个GitHub问题: 目前,您可以使用以下选项之一: Typescript的3.2版修复了这个问题。改进排列和静止参数处理的两个PRs是: 您现在可以使用npm安装来试用它t

我知道github上存在一些问题,但我不知道什么是固定的,什么不是,他们有2695个未解决的问题。所以我在这里发帖。我正在使用最新的Typescript 2.9.2


上述代码是否应该不起作用?如果可能的话,我如何修复它?

这在TypeScript 3.2版中已修复。看


看起来还不支持泛型类型的spread,但它存在一个GitHub问题:

目前,您可以使用以下选项之一:


Typescript的3.2版修复了这个问题。改进排列和静止参数处理的两个PRs是:

您现在可以使用
npm安装来试用它typescript@3.2

在3.2中,您的代码按原样工作


版本3.2已于2018年11月29日发布,您可以阅读更多信息。

您可以使用空白的花括号{}或类似以下示例的界面:

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


这个答案可能有助于在使用angular和firestoe时解决相同的问题

返回{id:item.payload.doc.id,
…item.payload.doc.data()}
作为员工

这会使他犯同样的错误。对于修复,您必须像这样进行更改

返回{id:item.payload.doc.id,
…item.payload.doc.data()作为雇员}

如果在3.2版之后仍然出现此错误,则可能存在“上游”类型错误,导致对象为未知对象,而不是实际对象。例如,如果您有扩展表达式
{…getData()}
,但是
getData
函数有编译错误,您可能会看到此错误


因此,请检查浏览器控制台中是否存在任何编译器错误,因为最终错误可能具有误导性。

看起来它无法正确地将
t
转换为
对象。尝试
函数foo(t:t):t{return{…(t as object)}as t;}
,这很奇怪,但效果很好。现在我将使用Object.assign。谢谢你知道吗,正如
tslint
所说的:
[tslint]使用对象扩展运算符。
:'(@CliteTailor因此,如果您不喜欢,请更改lint规则。linter应该帮助您建立某些规则,而不是阻止您编写您想要编写的内容。我使用的是版本
3.7.3
,但仍然发生在TypeScript 4.2中,并且仍然面对相同的规则。我将
…(t作为记录)
按照皮棉匠的建议将皮棉穿过@@并在11月最后一天发布:这是更干净的方法吗?
function foo<T extends object>(t: T): T {
  return { ...(t as object) } as T;
}
function foo<T extends object>(t: T): T {
  return Object.assign({}, t);
}
goodsArray.map(good => {
  return {
    id: good.payload.doc.id,
    ...good.payload.doc.data() as {}
  };
});
goodsArray.map(good => {
  return {
    id: good.payload.doc.id,
    ...good.payload.doc.data() as Goods // 'Goods' is my interface name
  };
});