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

时间:2019-05-17 12:30:24

标签: javascript typescript class types

我想在另一个文件中访问以下类:

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 的静态变量,因为它们已经丢失了在新声明的类型上。

如何正确键入?

2 个答案:

答案 0 :(得分:3)

我不确定您的代码的最终目标是什么。从TypeScript文档开始,您可能会使用的一种语法用法是修改类的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.

答案 1 :(得分:2)

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

unknownHostException

或者,如果您想使用与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" 完全相同的类型(构造函数签名和所有静态变量),则可以只使用typeof Person

Person