gpt4 book ai didi

javascript - 在 Typescript 中使用新对象更新 const 对象的所有属性

转载 作者:行者123 更新时间:2023-12-02 22:31:47 24 4
gpt4 key购买 nike

我想用相同类型的新对象更新 IMessage 类型的对象

interface IMessage {
id: string,
text: string,
// and many more attributes
}

const message: IMessage = {
id: "_id",
text: "old text",
// and many more attributes
}

const newMessage: IMessage = {
id: "_id",
text: "new text"
// and many more attributes
}

我期望更新后的 message 的值与 newMessage 完全相同,但我不能重新分配 message 对象,因为 message 被声明为 const。这是我到目前为止所拥有的

const updateMessage = (message: any, newMessage: typeof message): void => {
for (const attr in newMessage) {
if (attr !== "id" && newMessage.hasOwnProperty(attr)) {
message[attr] = newMessage[attr];
}
}
};

该功能正在运行。但在这个函数中,我必须声明 (message: any, newMessage: typeof message),否则 Typescript 会抛出警告 Element 隐式具有 'any' 类型,因为类型 'IMessage' 有没有索引签名。如何使该函数仅接受 IMessage 类型的参数?

最佳答案

您对使用 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);
};

但它在运行时的行为是相同的。

好的,希望有帮助;祝你好运!

Link to code

关于javascript - 在 Typescript 中使用新对象更新 const 对象的所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58875199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com