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

Posted

技术标签:

【中文标题】类型“T”上不存在属性 - 一般问题【英文标题】:Property does not exist on type 'T' - Generic problems 【发布时间】: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));

  ...

);

当然,改变

【问题讨论】:

【参考方案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 中不可用。如果我发现更多信息,我会在这里调查和更新...

以上是关于类型“T”上不存在属性 - 一般问题的主要内容,如果未能解决你的问题,请参考以下文章

类型“HttpEvent<Customer>”上不存在属性“数据”

类型“typeof ...”上不存在属性“use”,类型“typeof”上不存在属性“extend”

TypeScript:类型“”上不存在属性

错误 TS2339:类型“”上不存在属性“包含”

类型“”上不存在属性“forEach”

TypeScript - 类型上不存在属性(但存在)?