Javascript 如何在没有decorator的情况下重写这个js类

Javascript 如何在没有decorator的情况下重写这个js类,javascript,decorator,mobx,mobx-persist,Javascript,Decorator,Mobx,Mobx Persist,我想使用mobx而不使用decorator。通常我使用mobx包中的装饰,但在这种特殊情况下,我找不到一种方法使其工作 原始代码: import { observable } from 'mobx' import { create, persist } from 'mobx-persist' class Order { @persist('object') @observable currentOrder = null } 我尝试的是: import { observable,

我想使用mobx而不使用decorator。通常我使用mobx包中的
装饰
,但在这种特殊情况下,我找不到一种方法使其工作

原始代码:

import { observable } from 'mobx'
import { create, persist } from 'mobx-persist'

class Order {
  @persist('object')
  @observable
  currentOrder = null
}
我尝试的是:

import { observable, decorate } from 'mobx'
import { create, persist } from 'mobx-persist'
import { compose } from 'recompose'

class Order {
  currentOrder = null
}

decorate(Order, {
    currentOrder: compose(persist('object'), observable),
})
错误来自
persist
告知serializr decorator未正确使用。 你知道为什么这与上面的不同并且不起作用吗?

TL;博士 属性装饰器需要非常特定的组合实现

解决方案演示:

完整答案 属性装饰器基本上是表单的一个函数:
(目标、道具、描述符)=>modifiedDescriptor

因此,为了组合两个属性装饰器,您需要将第一个装饰器的结果作为第二个装饰器的第三个参数传递(以及
目标
属性

(与相同)从右向左应用函数,并将结果作为单个参数传递给下一个函数

因此,您不能使用
重新组合.compose
来组合装饰器,但您可以轻松地为装饰器创建一个作曲家:

/*compose.js*/
导出默认值(…装饰符)=>(目标、键、描述符)=>
减少(
(accDescriptor,decorator)=>decorator(目标,键,accDescriptor),
描述符
);
然后我们使用它来组合
可观察的
持久(“对象”)

/*Order.js*/
从“mobx”导入{可观察、装饰、动作};
从“mobx persist”导入{persist};
从“/compose”导入撰写;
阶级秩序{
currentOrder=null;
}
导出默认装饰(订单、{
当前顺序:撰写(
可见的,
持久化(“对象”)
)
});
[21/8/18]MobX的更新
=4.3.2
&
=5.0.4
: 我为&打开了PRs(已合并),以便在
decoration
实用程序功能中支持多个decorator OOB。
因此,这在MobX
=4.3.2
&
=5.0.4
=5.0.4中可用:

从'mobx'导入{装饰,可观察}
从“serializr”导入{serializable,primitive}
从“mobx persist”导入persist;
待办事项{
id=Math.random();
title=“”;
完成=错误;
}
装饰(待办事项){
标题:[可序列化(原语),持久化('object'),可观察],
完成:可见
})

一个更简单的解决方案是

类内容{
标题=“”
对象={
关键词:价值
}
}
装饰(待办事项){
标题:[持续,可观察],
对象:[持久化('object'),可观察]
})
无需安装serializr软件包。上述功能内置于mobx persist中