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



我想用相同类型的新对象更新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 implicitly has an 'any' type because type 'IMessage' has no index signature。如何使此函数只接受类型为IMessage的参数?

您对使用Object.assign()有什么想法?它将所有自己的和可枚举的属性复制到它的第一个参数中,就像您正在做的那样。将id排除在外会有一些小问题,但您可以通过使用rest对象析构函数来处理这个问题。像这样:

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);
};

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

好吧,希望能有所帮助;祝你好运

链接到代码

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)

关于Generics的TS文档:https://www.typescriptlang.org/docs/handbook/generics.html

最新更新