属性“ T”类型不存在-通用问题

时间:2018-10-18 09:57:22

标签: javascript angular typescript types

我有一个实用程序,它接受一个数组和一个谓词来执行数组过滤,但是在对谓词使用自定义类型之后,出现了错误提示

  

类型'T'不存在属性'name'

我认为通用属性类型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 :(得分:1)

如下所示更改您的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];
  }
}

由于未在arrayPredicate的类型中声明参数,因此假定它为空对象。

这是工作示例,

TypeScript example

答案 1 :(得分:0)

需要为数组添加类型,例如让数组的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
}