如何在打字稿中的 forEach 下定义类型?

how to define a type under forEach in typescript?

我有一个 PersonTypes 对象数组,我只想在 forEach 循环中使用部分键。更 打字稿中精确,正确的编码以提供类型?我可以做类似的事情 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);
} )

你应该坚持:

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);
});

根据您提供的附加代码,customZip 函数返回的类型为 any,这当然会在以后引起问题,因为数组的类型为 any而不是推断的 PersonType[]:

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

要解决这个问题,使用generics in TypeScript的概念很简单,它允许编译器自己推断数组的类型:

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

See proof-of-concept example.

您可以选择提供类型,或者干脆让 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},])
];