如何从泛型类访问静态变量?

Posted

技术标签:

【中文标题】如何从泛型类访问静态变量?【英文标题】:How to access a static variable from a generic class? 【发布时间】:2017-12-29 11:17:12 【问题描述】:

我有很多带有静态变量的类,如下所示:

user.ts:

export class User 
  static modelKey = 'user';

  // other variables

car.ts:

export class Car 
  static modelKey = 'car';

  // other variables

我想在某个地方像这样调用DataSource(见下文):

const dataSource = new DataSource<Car>();

data-source.ts:

export class DataSource<T> 

  constructor() 
    console.log(T.modelKey); // won't compile
    

当然,它不会编译,因为我不能简单地使用T.&lt;variable&gt;。所以,我的问题是:我怎样才能做到这一点?

Playground

【问题讨论】:

对打字稿了解不多,但看起来您正试图从 T 访问变量,其中没有变量 modelKey 的定义。在构造函数中请求作为 Car 和 User 父级的抽象变量并使用它而不是 T 可能会更好。 @ElijahSeedArita 你能详细说明一下吗?介意在playground 中复制它吗?谢谢。 检查this。编辑:不要相信我看看 GregL 的回答 【参考方案1】:

您不能访问类型的属性,只能访问传入的参数,因为类型在运行时不存在。

但是你可以将你的类传递给你的构造函数,然后访问它的属性。

例如

export class User 
  static modelKey = 'user';

  // other variables

export class Car 
  static modelKey = 'car';

  // other variables


interface ModelClass<T> 
  new (): T;
  modelKey: string;


export class DataSource<T> 

  constructor(clazz: ModelClass<T>) 
    console.log('Model key: ', clazz.modelKey); // will compile
    


new DataSource(Car);

Playground link

【讨论】:

谢谢,虽然它可能在操场上正常工作,但我的项目中出现以下错误:'Argument of type' type of car 'is not attributable to the parameter of type' ModelClass &lt;T&gt; ' 当我尝试执行 new DataSource(Car); 时。我怀疑这是因为 TS 2.4.x 引入了更好的泛型检查。在我的项目中,我使用的是最新版本的 TS(2.4.2),而游乐场使用的是 2.3.3(我认为)。你能帮帮我吗? 完全错误[ts] Argument of type 'typeof Car' is not assignable to parameter of type 'ModelClass&lt;T&gt;'. Type 'Car' is not assignable to type 'T'. 我设法使它从ModelClass 排除泛型工作:interface ModelClass ... 并完全删除new()。这是正确的方法吗? @dev_054:问题可能是您项目的Car 类没有无参数构造函数。要使@GregL 的代码适用于任何类,您应该将new (): T 更改为new (...args: any[]): T 另外,请记住,如果您想在构造函数之外的DataSource 方法中使用T 的静态属性(如clazz.modelKey),则应将clazz 存储为实例财产;最简单的方法是将clazz 参数声明为public(即constructor(public clazz: ModelClass&lt;T&gt;))。

以上是关于如何从泛型类访问静态变量?的主要内容,如果未能解决你的问题,请参考以下文章

泛型与通配符详解

Java 泛型泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )

Java泛型

泛型类中的静态方法?

JAVA——泛型类和泛型方法(静态方法泛型)

将泛型类扩展为静态内部类