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

时间:2018-03-02 14:11:43

标签: typescript design-patterns coding-style

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

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

每个对象都包含一个名为" createFromJson(...)"的静态方法。这对每个型号都是独一无二的。

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

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

1 个答案:

答案 0 :(得分: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);
}