首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型记录中有数据水化/脱水的类

类型记录中有数据水化/脱水的类
EN

Stack Overflow用户
提问于 2019-06-25 13:33:46
回答 1查看 1.6K关注 0票数 7

我希望在React + TS前端和节点+ TS后端之间共享TS类或接口。问题是TS类型在编译时被剥离,所以当我想将类实例转换为JSON时不能使用它们。

我想知道是否有任何解决方案可以在静态文件中描述我的对象,生成TS类,并使用该文件进行数据补充和脱水。一些属性是moment.js对象和Decimal.js对象。我正在寻找一种解决方案,可以根据静态描述符完成转换,我不需要手动为每个属性编写它。

脱水格式在HTTP请求中使用,另外它还存储在DB (Firebase Firestore)中,并由前端直接访问以供读取。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-26 12:40:02

我会使用令人敬畏的io-ts库来处理这个问题。

脱水格式在HTTP请求中使用,另外它还存储在DB (Firebase Firestore)中,并由前端直接访问以供读取。

通常,对于不同的层,我会采用不同的序列化格式。如果在您的具体情况下可以简化,那么

我想知道是否有什么解决方案可以用静态文件来描述我的对象。

使用io-ts,您可以将一组codec定义为表示域的TypeScript值。编解码器既是验证器,也是(反)序列化器,因此您可以很好地将类实例序列化为JSON字符串,反之亦然(前提是成功验证JSON,然后用适当的反序列化值实例化类)。

执行此类工作的简化和非常定制的编解码器如下:

代码语言:javascript
复制
// class definition:

class MyModel {
  constructor(readonly value: number) {}

  getValue() {
    return this.value;
  }
}

// codec definition:

import * as t from 'io-ts';
import { JSONFromString } from 'io-ts-types/lib/JSON/JSONFromString';

const MyModelFromString = new t.Type<MyModel, string, unknown>(
  'MyModel',
  (value): value is MyModel => value instanceof MyModel,
  str =>
    t.string
      .decode(str)
      .chain(JSONFromString.decode)
      .chain(json => t.type({ value: t.number }).decode(json))
      .map(({ value }) => new MyModel(value)),
  instance => JSON.stringify({ value: instance.value })
);

// usage:

MyModelFromString.decode('{ "value": 1 }').fold(
  errors => {
    console.error(errors);
  },
  inst => {
    // inst has type `MyModel` here
    console.log(inst.getValue());
  }
);

MyModelFromString.encode(new MyModel(2)); // '{ "value": 2 }'

在此基础上,您通常还需要处理序列化,这也是一种标记,它允许您决定尝试实例化哪个类,只需查看简单的序列化JSON字符串即可。

您可能还想看看io-ts-types,它已经包含了许多可以重用的现成编解码器,比如DateFromISOString

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56755316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档