我在销毁参数并在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'
有人可以解释,这是什么问题?
答案 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
答案 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 断言