如何在 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 中用静态变量表达构造函数?的主要内容,如果未能解决你的问题,请参考以下文章