Свойство не существует для типа 'T' - Общие проблемы - PullRequest
0 голосов
/ 18 октября 2018

У меня есть утилита, которая принимает массив и предикат для выполнения фильтрации массива, однако после использования моего пользовательского типа для предиката я получаю сообщение об ошибке

свойство 'name'не существует для типа 'T'

Я думал, что универсальный тип свойства T принял бы что-нибудь?

Я что-то упускаю из виду?

Array.ts

export type arrayPredicate = <T>(arg: T) => boolean;

ArrayUtil

static filterArray<T>(array: T[], arrayPred: arrayPredicate): T {
    const key =  Object.keys(array).find(obj => arrayPred(array[obj]));
    return array[key];
  }

Использование в тесте

const array = [
  {
    'name': 'object-1',
    'id': 1
  },
  {
    'name': 'object-2',
    'id': 2
  }
];

it(... , () => {

  // I get red squigglies under '.name'

  const myObj = ArrayUtils.filterArray(exceptionalStatuses, (status => status.name === findStatus));

  ...

});

Конечно, меняется

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Измените объявление arrayPredicate, как показано ниже.

export type arrayPredicate<T> = (arg: T) => boolean;

class ArrayUtils {
    static filterArray<T>(array: T[], arrayPred: arrayPredicate<T>): T {
    const key =  Object.keys(array).find(obj => arrayPred(array[obj]));
    return array[key];
  }
}

Поскольку вы не объявляете параметр type для arrayPredicate, предполагается, что он является пустым объектом.

Вот рабочий пример,

Пример машинописного текста

0 голосов
/ 18 октября 2018

Нужно добавить тип для вашего массива, например, пусть тип массива sat равен SampleType[].Тогда значение должно быть

const array: SampleType[] = [
  {
    'name': 'object-1',
    'id': 1
  },
  {
    'name': 'object-2',
    'id': 2
  }
];

Затем передать этот тип универсальной функции

 ArrayUtils.filterArray<SampleType>(exceptionalStatuses, (status: SampleType => status.name === findStatus));

SampleType должен быть

export class SampleType{
  name: string,
  id: string
}
...