我想在我的模型中维护一组成员,并且具有访问这些静态数组的通用方法。
假设我有:
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[] {
...
}
}
因此,子类指向它们自己的类型,而不是它们的父类型。有没有办法在没有明确的演员的情况下做到这一点,还是我在看反模式?
答案 0 :(得分:0)
支持此功能。我不认为这是一种反模式,尽管每个单独的用例本身可能适合也可能不适合。请注意确保静态函数返回的类型始终与静态函数的引用者类型匹配。
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所提到的,这个解决方案需要一些非理想的投射,但似乎有效。
答案 1 :(得分:-1)
在最新版本的打字稿中:
<div class="terms-nav">
<a class="trigger active" id="en">English</a>
<a class="trigger" id="fr">French</a>
</div>
<div id="english-terms">English Content</div>
<div id="french-terms" style="display:none">French Content</div>