【问题标题】:Property does not exist on type 'T' - Generic problems类型“T”上不存在属性 - 一般问题
【发布时间】:2019-03-23 02:44:03
【问题描述】:

我有一个使用数组和谓词来执行数组过滤的实用程序,但是在将我的自定义类型用于谓词之后,我收到一条错误消息

类型“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 types


    【解决方案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

    【讨论】:

    • 啊太棒了!谁能想到改变谓词中 的声明位置会产生如此深远的影响?!
    • @physicsboy TypeScript 不强制使用泛型参数,因此在没有泛型参数的情况下,它假定参数是一个空对象。
    【解决方案2】:

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

    【讨论】:

    • 啊,我忘了补充一点,我的数组实际上已经有了一个类型。我根据您的建议应用了更改,但我仍然收到相同的错误:-/
    • 我想我找到了我的问题。由于某种原因,.name 属性实际上在我的type 中不可用。如果我发现更多信息,我会在这里调查和更新...
    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 2020-11-07
    • 2019-12-09
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 2020-04-22
    相关资源
    最近更新 更多