gpt4 book ai didi

typescript - 在TypeScript中每次调用静态类方法时如何调用静态方法?

转载 作者:行者123 更新时间:2023-12-04 01:08:28 26 4
gpt4 key购买 nike

我创建了一个单例(抽象)类,它需要先初始化一些数据,然后才能使用大多数方法。这是该类的示例:

abstract class MyClass {
private static initialize(): void {
// do stuff
}

public static doStuff1(param1: string): string {
MyClass.initialize();
// do stuff
return 'stuff1';
}

public static doStuff2(param2: string[]): string[] {
MyClass.initialize();
// do stuff
return ['stuff2'];
}
}

有没有办法避免在每个方法上添加这些 initialize() 调用?我正在考虑使用装饰器并发现了这个相关问题:Typescript | Call a function every time a function is called

不幸的是,它使用的是遗留装饰器格式,至少这是我得到的错误:

语法错误 - 当前未启用对实验性语法“decorators-legacy”的支持

我试图使用 stage 2 proposal 找到等效的格式,但也许有更好的选择?

最佳答案

(通常不鼓励单例,但由于我不知道您的用例,我会假设您有充分的理由使用它们并且不会考虑其他选择)。

为了解决您的问题,您可以使用一些包装实用程序来装饰您的函数:

const wrap = <T extends (...args: any[]) => any>(func: T): T =>
<T>((...args: any[]) => {
// Do something before every function here...
return func(...args);
});

然后你可以这样定义你的函数:

abstract class MyClass {
public static doStuff1 = wrap((param1: string): string => {
// do stuff
return 'stuff1';
});
}

函数 doStuff1 现在保证在执行它自己的代码之前始终执行 wrap 中的代码。

此方法的问题是您无法访问 MyClass 的私有(private)状态或函数,这可能是您需要的。您可以在每次包装该方法时传递对该方法的引用,但那样做并不比在每个函数的开头调用它好多少。

更好的方法:非静态单例

无论如何,如果您正在使用单例,您最好以非静态方式实现它,并且可以免费保证一次性初始化的好处:

class MyClass {
private static instance?: MyClass;
static getInstance = (): MyClass =>
(MyClass.instance = MyClass.instance ?? new MyClass());

private constructor() {
// Do your initialization
console.log("initializing");
}

doStuff1() {
// do stuff
console.log("doing stuff 1");
}

doStuff2() {
// do stuff
console.log("doing stuff 2");
}
}

MyClass.getInstance().doStuff1();

// Output:
// initializing
// doing stuff 1

MyClass.getInstance().doStuff1();
MyClass.getInstance().doStuff2();

// Output:
// doing stuff 1
// doing stuff 2

请注意,从上面的输出中,初始化仅被调用一次,这(根据您的问题判断)似乎是所需的行为。

关于typescript - 在TypeScript中每次调用静态类方法时如何调用静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65553422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com