我想用相同类型的新对象更新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
被声明为{{ 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
的参数?
答案 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);
};
但是它在运行时的行为相同。
好的,希望能有所帮助;祝你好运!
答案 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