【问题标题】:How can I express a Constructor Function with static variables in Typescript?如何在 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() 方法。
  • 我更新了我的代码示例:构造函数被注入并分配给一个局部变量。所以我必须以某种方式表达注入的内容。

标签: javascript typescript class types


【解决方案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"
    

    【讨论】:

    • 第二个代码示例正是我要找的,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 2016-06-23
    相关资源
    最近更新 更多