如何从泛型类访问静态变量?
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.<variable>
。所以,我的问题是:我怎样才能做到这一点?
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 <T> '
当我尝试执行 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<T>'. 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<T>)
)。以上是关于如何从泛型类访问静态变量?的主要内容,如果未能解决你的问题,请参考以下文章