angular - 如何使用 Typescript 和 Angular 将 JSON 转换为复杂对象
问题描述
我有一个 JavaScript 函数,可以在我的 Typescript 类中创建一个样式对象。我的项目使用的是 Angular 版本 5:
private createCircle(parameters: any): any {
return new Circle({
radius: parameters.radius,
snapToPixel: parameters.snapToPixel,
fill: new Fill(parameters.fill),
stroke: new Stroke(parameters.stroke)
});
}
Circle
,Fill
并且Stroke
是第三方库类。函数参数 ( parameters
) 是一个 JSON 对象,如下所示:
{
"radius": 10,
"snapToPixel": true,
"fill": {
"color": "rgba(255, 255, 0, 0.4)"
},
"stroke": {
"color": "red",
"width": 1,
"lineDash": null,
"lineCap": "round",
"lineJoin": "round",
"miterLimit": 10
}
}
我可以Circle
直接将此 JSON 对象转换为一个类吗?( Circle
,Fill
并且Stroke
应该使用new
关键字创建)
解决方案
不,您还不能直接在 TypeScript 中执行此操作;对于您的特定用例,这是不可能的,因为如果没有适当的配置,任何编译器都无法在特定时刻理解您的特定意图。
不过,如果您希望魔法发生,有一些库可以提供帮助。例如,其中之一就是所谓的Type-aware-JSON。这允许您使用一组装饰器定义类,然后可以直接从 JSON 文件反序列化它们,然后使用相同的元数据序列化回来。在您的特定场景中,当类来自第 3 方时,我看到的唯一选择是扩展所有这些类并在每个属性上使用ta
装饰器代理每个属性。
但是,无浪漫的工厂功能会更有效。编写一个遍历每个对象并使其对每个属性做出反应的递归函数;另一种解决方案是再次扩展每个类并让它们接受正常的 JSON 结构,同时仍然通过调用super()
.
推荐阅读
- r - 操作列表组件
- python - 每个方面的 Y 轴自动缩放
- c - Fork() 代码未按预期工作 - 层次结构制作
- matlab - 如何在 Matlab 中将曲线拟合到直方图?
- r - 错误消息 AttributeError: 模块 'tensorflow' 没有属性 'VERSION'
- python - 将多索引级别数据框添加到另一个数据框
- c# - 从 Linq 查询中获取一个 int 而不是字符串
- ksqldb - KSQL 查询在键值前面有奇怪的键
- python - 如何在 Python 中以正确的顺序将抓取的数据写入数据帧
- sql-server - 在兼容模式 2008 上运行的 SQL Server 2016