提问人:physicsboy 提问时间:10/18/2018 最后编辑:StepUpphysicsboy 更新时间:10/5/2019 访问量:12845
类型“T”上不存在属性 - 一般问题
Property does not exist on type 'T' - Generic problems
问:
我有一个实用程序,它接受数组和谓词来执行数组的过滤,但是在将我的自定义类型用于谓词后,我收到一个错误,指出
属性“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));
...
});
当然,改变
答:
1赞
Sachila Ranawaka
10/18/2018
#1
需要为数组添加一个类型,例如数组的 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
}
评论
0赞
physicsboy
10/18/2018
啊,我忘了补充一点,我的数组实际上已经有一个类型了。我根据您的建议应用了更改,但我仍然收到相同的错误:-/
0赞
physicsboy
10/18/2018
我想我已经找到了我的问题。由于某种原因,该物业实际上在我的房源中不可用。如果我找到更多信息,我会在这里进行调查和更新.......name
type
1赞
Akash Kava
10/18/2018
#2
更改 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 的类型中声明参数,因此假定它是空对象。
这是工作示例,
评论
0赞
physicsboy
10/18/2018
啊太棒了!谁能想到改变谓语中<T>的宣布位置会产生如此深远的影响?!
0赞
Akash Kava
10/19/2018
@physicsboy TypeScript 不强制泛型参数,因此在没有泛型参数的情况下,它会假定参数为空对象。
评论