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

时间:2020-04-14 14:13:39

标签: typescript typescript-typings typescript2.0 typescript1.8

我有一个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);
} )

2 个答案:

答案 0 :(得分:6)

您应该坚持:

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


});

这是因为people数组中的每个对象的类型均为PersonTypes,实际上并不需要从该类型中提取属性。

实际上,不需要像PersonTypes那样将person明确地键入为PersonTypes[]。 TypeScript会自动推断出数组中的每个对象都是PersonTypes,所以这就足够了:

people.forEach((person) =>{


});  

或者,您可以选择分解参数,这将使您的函数更加简洁明了。

people.forEach(({ name, gender }) =>{  
  console.log(name);
  console.log(gender);
});

答案 1 :(得分:1)

根据您提供的其他代码,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},])
];