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

时间:2019-11-15 10:37:05

标签: javascript typescript

我想用相同类型的新对象更新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
}

我希望更新后的messagenewMessage的值完全相同,但是我不能仅仅重新分配message对象,因为message被声明为{{ 1}}。这是我到目前为止所拥有的

const

此功能正在工作。但是在此函数中,我必须声明const updateMessage = (message: any, newMessage: typeof message): void => { for (const attr in newMessage) { if (attr !== "id" && newMessage.hasOwnProperty(attr)) { message[attr] = newMessage[attr]; } } }; ,否则Typescript将引发警告(message: any, newMessage: typeof message)。如何使此函数仅接受类型为Element implicitly has an 'any' type because type 'IMessage' has no index signature的参数?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

U可以为此使用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