我正在使用JavaScript构建半强类型的lua序列化器。
这个想法是允许用户将字段/属性类型指示为元数据,并在序列化期间使用它,类似于c#中的属性。
例如
class foo {
property1 //Mark this as type number
method1(){};
}
class bar {
propFoo//Mark this as type foo
}
是的,我知道属性定义是无效的语法,但我只想表达这个想法。
然后当我将method1
反序列化为bar时,应在bar.propFoo
上定义{ "propFoo" : { "property1" : 2} }
描述符看起来很自然,但是很糟糕,它不支持自定义描述。
然后我看了看装饰工,看起来很有希望。但是我似乎无法弄清楚如何处理继承和覆盖。
例如
class foo{
property1 //Mark this as type number
}
class bar extends foo {
property1 //Overwrite and mark this as do not serialize/deserialize
}
然后,当我尝试将{ "property1" : 1 }
反序列化为foo
时,它应该具有property = 1
和property1 = undefined
反序列化为bar
原型似乎是另一种可能的解决方案,因为它处理继承链。但是,如果我将类型定义保留在一个对象内,则继承类的任何覆盖都将覆盖基类中的覆盖。 (原型继承不会创建属性的深层副本)
我不受ES
版本的限制。因此,可以使用TypeScript
进行编译的任何新功能都是可以接受的!