类型“T”上不存在属性 - 一般问题

Property does not exist on type 'T' - Generic problems

提问人:physicsboy 提问时间:10/18/2018 最后编辑:StepUpphysicsboy 更新时间:10/5/2019 访问量:12845

问:

我有一个实用程序,它接受数组和谓词来执行数组的过滤,但是在将我的自定义类型用于谓词后,我收到一个错误,指出

属性“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));

  ...

});

当然,改变

JavaScript Angular TypeScript 类型

评论


答:

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
我想我已经找到了我的问题。由于某种原因,该物业实际上在我的房源中不可用。如果我找到更多信息,我会在这里进行调查和更新.......nametype
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 的类型中声明参数,因此假定它是空对象。

这是工作示例,

TypeScript 示例

评论

0赞 physicsboy 10/18/2018
啊太棒了!谁能想到改变谓语中<T>的宣布位置会产生如此深远的影响?!
0赞 Akash Kava 10/19/2018
@physicsboy TypeScript 不强制泛型参数,因此在没有泛型参数的情况下,它会假定参数为空对象。