#typescript
#typescript
Вопрос:
interface Person {
name: string,
age: number,
height: number,
}
const bob: Person = {
name: 'bob',
age: 25,
height: 170
}
// How to declare the second parameter (info) type if I don't want to use 'any'
const updatePerson: (person: Person, info: any) => void = (person, info) => {
Object.assign(person, info)
}
updatePerson(bob, {height: 180})
console.log(bob) // { name: 'bob', age: 25, height: 180 }
updatePerson(bob, {age: 26})
console.log(bob) // { name: 'bob', age: 26, height: 180 }
Как вы можете видеть, второй параметр ‘info’ может содержать некоторые атрибуты типа Person, так как же мне определить его тип?
Моей первоначальной идеей было использовать утверждение типа «информация как лицо», но, похоже, это не лучшее решение, но чтобы избежать проблемы.
Ответ №1:
Вы можете использовать Partial для info
параметра.
Создает тип, для всех свойств которого установлено значение необязательный. Эта утилита вернет тип, который представляет все подмножества данного типа.
const updatePerson: (person: Person, info: Partial<Person>) => Person = (person, info) => {
return Object.assign(person, info)
}
Комментарии:
1. Вау! Ответ был слишком быстрым, и он полностью решил мою проблему, спасибо!!!
Ответ №2:
Вы можете использовать эту информацию также как Person, но вам необходимо изменить свой код таким образом, чтобы значения модели были необязательными
interface Person {
name?: string,
age?: number,
height?: number,
}
const bob: Person = {
name: 'bob',
age: 25,
height: 170
}
// How to declare the second parameter (info) type if I don't want to use 'any'
const updatePerson: (person: Person, info: Person ) => void = (person, info) => {
Object.assign(person, info)
}
updatePerson(bob, {height: 180})
console.log(bob) // { name: 'bob', age: 25, height: 180 }
updatePerson(bob, {age: 26})
console.log(bob) // { name: 'bob', age: 26, height: 180 }