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

时间:2018-04-03 18:06:38

标签: typescript

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

假设我有:

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[] {
        ...
    }
}

因此,子类指向它们自己的类型,而不是它们的父类型。有没有办法在没有明确的演员的情况下做到这一点,还是我在看反模式?

2 个答案:

答案 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>