我有一个实用程序,它接受一个数组和一个谓词来执行数组过滤,但是在对谓词使用自定义类型之后,出现了错误提示
类型'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));
...
});
当然,要更改
答案 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的类型中声明参数,因此假定它为空对象。
这是工作示例,
答案 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
}