如何获得泛型类型的属性?

时间:2017-09-07 15:57:47

标签: typescript generics

我有一个抽象类,在我传递泛型类型的方法中。接下来,我需要获取此项的属性,如何正确执行?

callback

2 个答案:

答案 0 :(得分:8)

您的代码假定您的班级使用的每种类型T都可能具有id属性。

正如Jon Sharpe在你对你的问题的评论中指出的那样,无论是在类型安全性还是表现力方面,正确的方法是将这个假设声明为类型约束,使其明确并为类型检查器所知。 / p>

执行此操作的方法是在泛型类型参数上使用类型约束语法。

例如,你可以写

export interface MayHaveId {
  id?: number; // you can use any type, number is just an example
}

export abstract class BaseService<T extends MayHaveId> {
  saveItem(item: T) {
    if (item.id !== undefined) {
      console.log(item.id);
    }
  }
} 

这里我们已经定义了一个接口来使代码更具可读性,但类型文字也可以使用。

请注意,id属性被声明为可选属性,因为您的逻辑不要求它具有值。

如果您只打算将bass类与具有id的类型参数一起使用,那么您应该使该属性成为必需属性。这将使代码更容易理解,并且会在编译时捕获更多错误,确保它首先仅用于此类类型。

Shahbaaz在评论中询问动态属性。

我们可以使用参数泛型类型

来定义具有动态属性的类型
type WithProperty<K extends string, V = {}> = {
  [P in K]: V
}

我们可以使用这种类型

function withProperty<T, K extends string, V> (x: T, properties: WithProperty<K, V>) {
  return Object.assign(x, properties);
}

答案 1 :(得分:1)

在尝试获取值之前,您可以使用item.hasOwnProperty('id')。

参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty