как определить тип под forEach в машинописи? - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть массив PersonTypes объектов, и я хотел бы использовать только часть ключа внутри forEach l oop. что является более точным, правильное кодирование в машинописи, чтобы обеспечить тип? Я могу сделать что-то вроде people.forEach((person: Pick<PersonTypes, 'name' | 'gender'> или people.forEach((person: PersonTypes) =>{ или people.forEach((person: any) =>{, что является правильным способом кодирования в машинописи

export type PersonTypes = {
  name: string;
  value: string;
  gender: boolean;
};
const people: PersonTypes[] = [
  {name: 'apl', value: 'apple', gender: true},
  {name: 'gal', value: 'google', gender: false},
]
people.forEach((person: Pick<PersonTypes, 'name' | 'gender'>) =>{
//people.forEach((person: PersonTypes) =>{
//people.forEach((person: any) =>{
  console.log(person.name);
  console.log(person.gender);
} )

Ответы [ 2 ]

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

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

people.forEach((person: PersonTypes) =>{


});

Это потому, что каждый объект в массиве people имеет тип PersonTypes, и нет необходимости извлекать свойства из этого типа.

На самом деле нет необходимости явно вводить person как PersonTypes, так как people имеет значение PersonTypes[]. TypeScript автоматически определит, что каждый объект в массиве равен PersonTypes, поэтому этого будет достаточно:

people.forEach((person) =>{


});  

В качестве альтернативы, вы можете выбрать деструктурирование параметра, что сделает вашу функцию более краткой и чистой.

people.forEach(({ name, gender }) =>{  
  console.log(name);
  console.log(gender);
});
1 голос
/ 14 апреля 2020

На основе предоставленного вами дополнительного кода функция customZip возвращает тип any, что, конечно, вызывает проблемы позже, поскольку массив будет иметь тип any вместо логического PersonType[]:

export function customZip(...arrays: Array<any>){
  return arrays
}

Чтобы исправить это, достаточно просто использовать концепцию обобщений в TypeScript , которая позволяет компилятору самостоятельно определять тип массива:

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

См. Пример проверки концепции .

Вы можете указать тип или просто позволить TypeScript выводить сам по себе. На самом деле это не имеет значения: оба будут правильно скомпилированы:

// You let TypeScript do the inferring by itself
const people = [
  ...customZip([{name: 'apl', value: 'apple', gender: true},
  {name: 'gal', value: 'google', gender: false},])
];

... или ...

// Your manually inform TypeScript what the type of an array member returned from customZip looks like
const people = [
  ...customZip<PersonTypes[]>([{name: 'apl', value: 'apple', gender: true},
  {name: 'gal', value: 'google', gender: false},])
];
...