Деструктурирование параметров функции в Typescript

#javascript #node.js #mongodb #typescript #express

#javascript #node.js #mongodb #typescript #выразить

Вопрос:

Итак, у меня есть эта небольшая функция, которая заботится об обновлении документа todo в базе данных, это выглядит так

 async function update({id, ...todoInfo }: ITodo) { // this line here
    const db = await makeDb()
    const foundTodo = await db.collection('todos').updateOne({ _id: transformId(id) }, { $set: { ...todoInfo } })
    return foundTodo.modifiedCount > 0 ? { _id: id, ...todoInfo } : null
  }
 

id Свойство должно исходить из объекта req.params, а ...todoInfo свойство — из объекта req.body . Но typescript выдает ошибку, которая property id does not exist on interface ITodo . Как мне преодолеть эту проблему? Интерфейс ITodo в настоящее время выглядит следующим образом,

 export interface ITodo {
  todo_name: string
  start_time: Date
  end_time: Date
  description: string
  priority: Priority
}
 

Я попробовал этот метод, но это привело к вложенности объектов таким образом.. {todoInfo: {todo_name...}}

 async function update({id, ...todoInfo }: {id: string, todoInfo: ITodo}) {
    const db = await makeDb()
    const foundTodo = await db.collection('todos').updateOne({ _id: transformId(id) }, { $set: { ...todoInfo } })
    return foundTodo.modifiedCount > 0 ? { _id: id, ...todoInfo } : null
  }
 

Я не хочу добавлять свойство id в интерфейс, потому что либо я продолжаю использовать его везде, либо я мог бы сделать его необязательным, что приведет к путанице с другими вызовами функций, потому id что свойство не может быть неопределенным. Большое вам спасибо.

Ответ №1:

Вы можете использовать тип пересечения:

 async function update({ id, ...todoInfo }: { id: string } amp; ITodo) {
    //...     
}
 

Ссылка на игровую площадку