Как использовать сокращение для замены фильтра и отображения в машинописном тексте

#typescript #reduce

Вопрос:

У меня есть простой пример, такой как

     interface employer {
      name: string;
      age: number;
    }

    const arr: employer[] = [{name:'Amy',age:18},{name:'Bob',age:20}];

    let data = arr.reduce((c, b) =>  b.age > 18 ? [...c, b] : c,[])

    console.log(data)
 

Я просто хочу arr заполнить массив и вернуть возраст человека выше 18, например
Но я получаю ошибки

 No overload matches this call.
  Overload 1 of 3, '(callbackfn: (previousValue: employer, currentValue: employer, currentIndex: number, array: employer[]) => employer, initialValue: employer): employer', gave the following error.
    Type 'employer[]' is missing the following properties from type 'employer': name, age
  Overload 2 of 3, '(callbackfn: (previousValue: never[], currentValue: employer, currentIndex: number, array: employer[]) => never[], initialValue: never[]): never[]', gave the following error.
    Type 'employer[]' is not assignable to type 'never[]'.
      Type 'employer' is not assignable to type 'never'.

 

Для этого b.age > 18 ? [...c, b] : c
Я думаю, что это сработало для javascript
Как мы можем это исправить?
Спасибо

Ответ №1:

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

 let data = arr.reduce<employer[]>((c, b) =>  b.age > 18 ? [...c, b] : c,[])
 

кроме того, это действительно

 let data = arr.reduce((c, b) =>  b.age > 18 ? [...c, b] : c,[] as employer[])
 

но я думаю, что первый выглядит лучше.

Вы можете найти рабочий пример на этой игровой площадке

Ответ №2:

Я пробую другой способ

 interface employer { 
      name: string; 
      age: number; 
    } 
 
    const arr: employer[] = [{name:'Amy',age:18},{name:'Bob',age:20}]; 
 
    let data = arr.reduce((c:any, b:any) =>  b.age > 18 ? [...c, b] : c,[]) 
 
    console.log(arr)
 

Комментарии:

1. Однако с этим вы теряете безопасность типа

2. Почему вы думаете, что это неправильно @GeorgiosKampitakis?

3. Использование any нарушает цель использования типов, если вы сделаете arr.reduce((c:any, b:any) => b.wrong > 18 ? [...c, b] : c,[]) это, все равно произойдет компиляция, но возникнет ошибка времени выполнения, b.wrong существующая в любом типе.