在Javascript中启用方法链

在Javascript中启用方法链,javascript,typescript,prototype,method-chaining,Javascript,Typescript,Prototype,Method Chaining,这个问题主要是关于将行为注入对象时的javascript最佳实践。我有一堆小对象,它们遵循一些接口: export interface Semigroup<A> { append(l: A, r: A): A; } export interface Monoid<A> extends Semigroup<A> { empty(): A; } 导出接口半群{ 附加(l:A,r:A):A; } 导出接口幺半群扩展半群{ 空():A; } 还有

这个问题主要是关于将行为注入对象时的javascript最佳实践。我有一堆小对象,它们遵循一些接口:

export interface Semigroup<A> {
    append(l: A, r: A): A;
}

export interface Monoid<A> extends Semigroup<A> {
    empty(): A;
}
导出接口半群{
附加(l:A,r:A):A;
}
导出接口幺半群扩展半群{
空():A;
}
还有一系列处理这些对象的组合方法。将这些作为方法链使用要好得多

为了使一组静态方法在一组对象上可用,我看到了两个明显的解决方案:

  • 创建一个原型对象,并在所有基本类型上设置它
  • 将所有基类型封装在转发基本行为的适配器中
我目前使用的是后者:

class AMonoid<A> implements Monoid<A> {
    private theMonoid: Monoid<A>;
    constructor(theMonoid: Monoid<A>) {
        this.theMonoid = theMonoid;
    }
    append(l: A, r: A): A {
        return this.theMonoid.append(l, r);
    }
    empty(): A {
        return this.theMonoid.empty();
    }
    liftMap(): AMonoid<Map<any, A>> {
        return liftMonoidToMap(this);
    }
    fold(): F.AFold<A, A> {
        return foldMonoid(this);
    }
}

export const sum = new AMonoid({
    empty: () => 0,
    append: (l,r) => l+r
});
类AMonoid实现了幺半群{ 私有幺半群:幺半群; 构造函数(幺半群:幺半群){ this.theMonoid=theMonoid; } 附加(l:A,r:A):A{ 返回this.theMonoid.append(l,r); } 空():A{ 返回this.theMonoid.empty(); } liftMap():AMonoid{ 返回LIFTMONIIDTOMAP(本); } fold():F.AFold{ 返回foldMonoid(this); } } 导出常量和=新的AMonoid({ 空:()=>0, 附加:(l,r)=>l+r });
原型解决方案看起来更像javascript-y,但我担心意外的副作用。如果包裹的对象意外地拥有一个实用方法,会发生什么?在这种情况下,是否可以让typescript创建类型错误?私有方法/属性能很好地处理这个问题吗?

我不明白这个问题。我是什么?liftMap、fold等方法与您定义的两个接口有什么关系?如果您使用的是代数类型,如幺半群,您应该了解函子。您可以轻松地使用一个简单的标识函子来执行一系列的
.map
转换,这些转换将与内部保存的值进行交互。@matthelliwell谢谢您的回答,我更新了示例以使我的问题更加明显。我想您需要决定使用哪种语言。这段代码是TypeScript。在TS(据我所知,我不是专家)中,这种风格可能更自然。但在Javascript中,原型链或mixin可能更为惯用。覆盖方法可能是一个问题,不管你怎么做,但只要覆盖保持相同的签名,我认为这并不重要;它甚至可能很有用:例如,当您可以使用
ap
map
定义
lift
时,您的类型可能具有更高效的实现。正如@VLAZ所说,看看如何在Typescript中实现函子,并扩展该方法。但基本上我会使用类而不是改变原型。