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