как обеспечить тип из объекта с типом любой в деструктурирующем виде - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть один массив объектов с типами, который построен функцией с типом Array<any> и хотел бы использовать только часть ключа внутри forEach l oop. что является более точным, правильное кодирование в машинописи, чтобы обеспечить тип?

Какой правильный способ кодирования в машинописи, я могу использовать forEach(xxx:any), но я хотел бы использовать как объект деструктуры

export function customFunc(...arrays: Array<any>){
  return arrays
}
export type PersonTypes = {
  name: string;
  value: string;
  gender: boolean;
};
const people = [
  ...customFunc([{name: 'apl', value: 'apple', gender: true},
  {name: 'gal', value: 'google', gender: false},])
]
people.forEach(person => {
  person.forEach(({name, gender})=>{ 
### how to provide type with destructure object with error Binding element 'name' implicitly has an 'any' type
    console.log(name);
    console.log(gender);
  });
});

1 Ответ

0 голосов
/ 14 апреля 2020

Ваша проблема вызвана тем, что вы набираете arrays параметр customFunc: когда он Array<any> (буквально "массив any") и параметр только что возвращен, выводимый тип функции возвращается также "массив из any".

Вам нужно сообщить, что будет содержать массив, и вы можете сделать это, указав форму объекта:

export function customFunc(...arrays: Array<{ name: string; value: string }>){
  return arrays
}

или с помощью универсальных шаблонов. :

export function customFunc<T extends {}>(...arrays: Array<T>){
  return arrays
}

в этом случае тип возвращаемого значения функции будет выведен из формы объекта, переданного в функцию (в той точке, где вызывается функция).

Первый подход лучше, когда функция ожидает точную форму (потому что она, например, выполняет некоторые манипуляции с указанными c полями), тогда как последняя лучше, когда функция делает что-то, где точная форма не ожидается (вы можете «объединить» подходы, сделав параметр extends более конкретен c, чем просто {}).

...