如何在 Typescript 中用静态变量表达构造函数?

Posted

技术标签:

【中文标题】如何在 Typescript 中用静态变量表达构造函数?【英文标题】:How can I express a Constructor Function with static variables in Typescript? 【发布时间】:2019-10-04 18:58:27 【问题描述】:

我想在不同的文件中访问以下类:

export class Person 

    constructor() 

    static getDatabaseId(): string 
        return '...';
    

它是注入的,而不是实际导入的。我想说明它是一个构造函数,它可以创建 Person 类型的新实例。这是我尝试过的:

let PersonConstructor: new(): Person;

// inject Person constructor function
beforeEach(inject((_Person_) => 
    PersonConstructor = _Person_;
));

// create a new instance but also access the static variables
const p: Person = new PersonConstructor();
PersonConstructor.getDatabaseId(); // "property does not exist"

编译器不再抱怨从 Person 实例化新实例,但当然它现在也不知道 Person 的静态变量,因为它们丢失了在新声明的类型上。

如何才能正确输入?

【问题讨论】:

什么是“const Person: new(): Person)”? 我重命名了它,这样更清楚:PersonConstructor 是一个构造函数,用于创建 Person 类型的实例。 实例成员属于类而不是对象,这意味着每当您创建 Person 的新实例时,它都不会有静态成员,在本例中为 getDatabaseId() 方法。 我更新了我的代码示例:构造函数被注入并分配给一个局部变量。所以我必须以某种方式表达注入的内容。 【参考方案1】:

我不确定您的代码的最终目标是什么。从TypeScript doc 开始,您要达到的语法的一种可能用法是修改类的static 成员并使用新的静态成员创建新实例。

如果你要这样做,正确的代码应该是这样的

let PersonConstructor: typeof Person = Person;

// create a new instance but also access the static variables
const p: Person = new PersonConstructor();
PersonConstructor.getDatabaseId(); // Also OK and you my change it. Original Person will not get it changed.

【讨论】:

【参考方案2】:

您可以使用构造函数签名方法,但您需要添加您需要访问的任何其他成员。

import Person from './Person';

let PersonConstructor: 
    new(): Person
    getDatabaseId(): string
 = Person;

// create a new instance but also access the static variables
const p: Person = new PersonConstructor();
PersonConstructor.getDatabaseId(); // "property does not exist"

或者,如果您想使用与Person 完全相同的类型(构造函数签名和所有静态),则可以只使用typeof Person

import Person from './Person';

let PersonConstructor: typeof Person = Person;

// create a new instance but also access the static variables
const p: Person = new PersonConstructor();
PersonConstructor.getDatabaseId(); // "property does not exist"

【讨论】:

第二个代码示例正是我要找的,谢谢!

以上是关于如何在 Typescript 中用静态变量表达构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在构造函数 C++ 中使用静态变量?

Java之变量

抽象类借口构造函数静态方法成员

TypeScript 静态类

如何比任何其他全局或静态变量更早地创建/构造类实例?

如何在 Angular 2 / Typescript 中声明全局变量? [关闭]