打字稿泛型破坏和传播问题

时间:2019-01-08 11:55:46

标签: typescript

我在销毁参数并在Typescript中创建相同类型的新对象时遇到问题。

此代码有效:

function func<T extends { attr: string }>(param: T): T {
  const { ...rest } = param;
  return { ...rest };
}

这段代码不起作用:

function func<T extends { attr: string }>(param: T): T {
  const { attr, ...rest } = param;
  return { attr, ...rest };
}

错误消息是:

Type '{ attr: string; } & Pick<T, Exclude<keyof T, "attr">>' is not assignable to type 'T'

有人可以解释,这是什么问题?

2 个答案:

答案 0 :(得分:0)

我认为这是该问题的简化展示。

function func2<T extends { a: string, b: string }>(param: T)
    : { a: string, b: string } {
    const { a, ...rest } = param;
    const x = rest.b; // Property 'b' does not exist on type 'Pick<T, Exclude<keyof T, "a">>'.
    return { a, ...rest }; // Property 'b' is missing in type '{ a: string; } & Pick<T, Exclude<keyof T, "a">>' 
                           // but required in type '{ a: string; b: string; }'.
}

似乎与3.2中最近添加的“对象文字中的通用扩展表达式”有关:https://github.com/Microsoft/TypeScript/pull/28234

Seems like a bug to me.

答案 1 :(得分:0)

根据进一步调查后 https://github.com/Microsoft/TypeScript/issues/29081现在已对语法进行了少许修改:

function func<T extends { attr: string }>(param: T): T {
  const { attr, ...rest } = param;
  return { attr, ...rest } as T;
}

根据https://github.com/Microsoft/TypeScript/issues/28884#issuecomment-448356158,暂时必须使用 as T 断言