如何使多个类包含相同的静态方法名称?

问题描述 投票:1回答:1

我创建了一个IUserModel,它有几个方法,每个子类都将实现。

我有两个用户类型类:CoordinateLeaderModel和CommunityMemberModel

每个对象都包含一个名为“createFromJson(...)”的静态方法,该方法对于每个模型都是唯一的。

我想知道是否有办法将静态方法放在层次结构中更高的位置,这样如果我创建另一个类似“AdminModel”的用户类型,我会记得创建一个静态的“createFromJson()”方法。

是否有特定的设计模式来实现这样的目标?

typescript design-patterns coding-style
1个回答
1
投票

有一个proposed功能允许这个,但它尚未实现。不确定它是否会被实施。

在不考虑这是否是好设计的情况下,我们可以通过一种解决办法来迫使我们实施该方法。我们可以在模块中定义基类,但不能导出它,而是导出一个函数,该函数将接收隐藏基类并返回派生类的函数作为参数。然后我们可以强制派生类具有某些方法:

abstract class _ModelBase {
    private isModel: true
}
export type ModelBase = typeof _ModelBase; // Export so people can use the base type for variables but not derive it
export function modelBase<T extends { new(... p: any[]): _ModelBase,  createFromJson(): _ModelBase } >(clsDeclarator: (baseClass: typeof _ModelBase)=> T) : T {
    return clsDeclarator(_ModelBase);
}


const AdminModel = modelBase(base => {
    class AdminModel extends base
    {
        private d:string;
        static createFromJson() { // will fail if this is missing
            return new AdminModel("");
        }
        constructor (n: string) {
            super();
        }
    }
    return  AdminModel;
});

上面的实现并没有强制createFromJson返回当前类的实例,如果我们使用typescript 2.8,我们也可以强制执行:

export function modelBase<T extends { new(... p: any[]): _ModelBase } >(clsDeclarator: (baseClass: typeof _ModelBase)=> T &  { createFromJson(): InstanceType<T> }) : T {
    return clsDeclarator(_ModelBase);
}
© www.soinside.com 2019 - 2024. All rights reserved.