gpt4 book ai didi

typescript - 从静态方法(Typescript)中访问自己的类型

转载 作者:搜寻专家 更新时间:2023-10-30 22:03:22 24 4
gpt4 key购买 nike

我想在我的模型中维护一个成员数组,并有访问这些静态数组的通用方法。

假设我有:

class A {
static _records: A[]

static getRecords(): A[] {
...
}
}

class B extends A {}

// Some other file
let allBs: B = B.getRecords();

我想做的是用类似的东西声明 A:

class A {
static _records: OWN_CLASS[]

static getRecords(): OWN_CLASS[] {
...
}
}

因此子类指向它们自己的类型,而不是它们的父类型。有没有办法在没有显式转换的情况下做到这一点,或者我正在寻找反模式?

最佳答案

这是支持的。我不认为这是一种反模式,尽管每个单独的用例本身可能合适也可能不合适。请注意确保静态函数返回的类型始终与静态函数的引用类型匹配。

class MyType {
public static INSTANCES: this[];

public static get(): this[] {
return MyType.INSTANCES.filter((instance) => instance instanceof this);
}
}

class MyType2 extends MyType {
}

const myType2s: MyType2[] = MyType2.get();

编辑:

听起来这个解决方案可能不适用于某些版本的 TypeScript。

为此有一个开放的 TypeScript 票证 (#5863)。听起来它应该可以工作,但可能需要略有不同的解决方案,具体取决于您使用的 TypeScript 版本。

来自 bjouhier 的链接评论提供了以下选项:

class Singleton {
private static _instance?: Singleton;

public static getInstance<T extends Singleton>(this: { new(): T }) {
const constr = this as any as typeof Singleton; // hack
return (constr._instance || (constr._instance = new this())) as T;
}
}

class Foo extends Singleton {
public foo() { console.log('foo!'); }
}

class Bar extends Singleton {
public bar() { console.log('bar!');}
}

Foo.getInstance().foo();
Bar.getInstance().bar();

正如 bjouhier 所提到的,此解决方案需要一些不理想的转换,但它似乎有效。

关于typescript - 从静态方法(Typescript)中访问自己的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49636551/

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