2 回答

TA贡献1966条经验 获得超4个赞
你对使用有Object.assign()什么想法?它将所有自己的和可枚举的属性复制到它的第一个参数中,正如您所做的那样。免除id这一点会有一点小问题,但您可以通过使用rest object destructring来解决这个问题。像这样:
const updateMessage = (message: IMessage, newMessage: IMessage): void => {
const { id, ...nm } = newMessage; // make nm from newMessage without id prop
Object.assign(message, nm); // update message with nm
};
这应该像您的原始updateMessage()函数一样没有类型错误。请注意,这不是特别类型安全,因为Object.assign()的类型允许任何参数。您可以进行自己的输入,以确保后续参数不会添加任何意外属性,如下所示:
const safeAssign: <T>(target: T, ...args: Partial<T>[]) => T = Object.assign;
const updateMessage = (message: IMessage, newMessage: IMessage): void => {
const { id, ...nm } = newMessage;
safeAssign(message, nm);
};
但它在运行时的任何一种方式都是一样的。

TA贡献1856条经验 获得超17个赞
您可以为此使用 TS 通用类型。
function updateMessage <T>(message: T, newMessage: T): void {
for (const attr in newMessage) {
if (attr !== "id" && newMessage.hasOwnProperty(attr)) {
message[attr] = newMessage[attr];
}
}
};
然后在调用函数时传递类型。
updateMessage<IMessage>(message, newMessage)
关于泛型的 TS 文档:https : //www.typescriptlang.org/docs/handbook/generics.html
添加回答
举报