打字稿中具有数据水合/脱水的类

2024-03-05

我想分享 React + TS 前端和 Node + TS 后端之间的 TS 类或接口。问题是 TS 类型在编译时被剥离,所以当我想将类实例转换为 JSON 时我无法使用它们。

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

脱水格式用于 HTTP 请求,并且存储在 DB(Firebase Firestore)中并由前端直接访问以进行读取。


我会使用很棒的方法来解决这个问题io-ts https://github.com/gcanti/io-ts图书馆。

脱水格式用于 HTTP 请求,并且存储在 DB(Firebase Firestore)中并由前端直接访问以进行读取。

一般来说,我会假设不同层有不同的序列化格式。如果在您的具体情况下可以进行这种简化,那么????

我想知道是否有任何解决方案可以在静态文件中描述我的对象

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

执行此类工作的简化且非常自定义的编解码器如下:

// 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 https://github.com/gcanti/io-ts-types其中已经包含许多您可以重用的现成编解码器,例如DateFromISOString.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打字稿中具有数据水合/脱水的类 的相关文章

随机推荐

  • 将 HasMany 和 ManyToMany 关系公开为 IEnumerable

    目前 在我的实体中 我将集合公开为 IList 但我一直在考虑将它们公开为 IEnumerable 以防止用户手动添加到集合中 我为这些操作添加了特定的内容 以便我可以确保我的双向关系保持完整 在这种情况下 我想到了几个问题 如果我将它们公
  • 两个字符串所有可能的LCS(最长公共子序列)

    我们可以用DP 动态规划 求出两个字符串的LCS 最长公共子序列 通过跟踪 DP 表 我们可以获得 LCS 但如果存在不止一艘濒海战斗舰 我们怎样才能获得全部呢 Example string1 bcab string2 abc 这里 ab
  • docker nginx 容器的日志存储在主机的哪里

    I use 默认 nginx 镜像 https hub docker com nginx 和Filebeat读取日志并发送给ELK 两个容器 nginx 容器和 Filebeat 容器 都位于同一主机上 这是 nginx 镜像的 Docke
  • 卸载使用 CUDA 内存的 mex 文件时 MATLAB 崩溃

    我已经尝试解决这个问题有一段时间了 我在使用 CUDA 的 matlab Linux 64 位 中使用 MEX 文件 代码编译并执行得很好 但是当我想卸载 mex 时 例如重新编译它或当 matlab 退出时 matlab 立即崩溃 没有任
  • new File(path) 实际上总是在 android 上创建一个文件?

    我正在尝试检查 Android SD 卡上是否存在文件 所以我这样做 File f new File sdpath DATABASE NAME if f exits create new file else do something 每次实
  • 如何在弹出窗口中动态创建 HTML 元素?

    之前 我使用 window showModalDialog 函数弹出一个窗口 window showModalDialog myHtml 在 myHtml 中 有一些 html 元素 例如文本区域和两个按钮 但现在情况发生了变化 任何htm
  • 查找用户位置

    我正在尝试获取我的天气应用程序的用户位置 我目前无法这样做 并尝试遵循 Google 最后已知位置指南以及https guides codepath com android Retriving Location with LocationS
  • 通过 GitHub 发布 Webhook 触发 AWS CodePipeline

    AWS CodePipeline 现在支持 GitHub WebHook 但默认情况下每次在主分支上推送 更改 代码时 都会触发 CodePipeline 但是 我只希望它在我实际发布版本时运行 因此 我手动配置了自动生成的 GitHub
  • 设置具有多个值的本地化字符串的格式

    我创建了一个本地化字符串 其形式类似于 text key Collected d out of d 并使用以下格式化程序 let numberOfItems 2 let totalNumberOfItems 10 let format NS
  • 在R中过滤掉多列

    假设一个数据集有多个行和列 其中一些列为 0 我的意思是该列中的所有值都是 0 如何过滤掉这些列 我已尝试使用以下代码但无济于事 training data lt Filer function x all x 1 99 0 training
  • Flutter - 轻按时检测 TextField

    我在 Windows 中制作了一个 Flutter 应用程序并且一切正常 但是当我尝试编译到 iOS 时抛出了意外错误 在文本字段中检测到 onTap 不是正确的参数 我不知道会发生什么 在 Windows 中不会返回此错误 反正 有人知道
  • 设置输入高度为父级的 100%

    我在设置输入 键入文本 高度以适合 100 的父母时遇到了一些问题 td 高度 我什至尝试迭代每个输入并使用 jQuery 手动设置它的高度 但这需要相当多的时间 我正在处理的网站有很多单元格 并且仍然无法在 IE 7 和 8 上工作 我有
  • 将表单身份验证添加到 ASP.Net 项目会导致 401.2 未经授权?

    我正在尝试将表单身份验证插入到最初使用 VS 2013 和 ASP Net 4 0 使用无身份验证模板创建的 ASP Net 项目中 我已遵循 MSDN 上的建议 并将其添加到 system web 下的 Web Config 中
  • 添加资源文件到xcode

    我正在尝试将一些新的资源文件添加到由另一个人在另一台 Mac 上构建的项目中 我认为该项目有前人的规定 使用右键单击 gt 将文件添加到 MyProject 不会提供预期的结果 编译项目后 添加的文件在应用程序中不可见 如何在我的项目中添加
  • 最新的 Jersey 示例不起作用

    我已经安装了最新版本的球衣 捆绑版本 2 13 0 以及该版本的示例 然后我尝试了 用于测试 Restful 服务 examples helloworld pure jax rs src main java org glassfish je
  • JavaScript 加载图像的进度

    JS 有没有办法在加载图像时获取加载图像的进度 我想使用HTML5新的Progress标签来显示加载图像的进度 我希望有这样的东西 var someImage new Image someImage onloadprogress funct
  • MongoDB - 大量 MongoCleaner 线程

    不知何故 我的 java 应用程序与 mongodb 通信最终产生了大量名为 MongoCleanerXXX 的停放 睡眠 线程 我认为它来自驱动程序 其数量约为 600 显然数据库存在一些连接问题 在 mongod 重新启动一段时间后确实
  • 我的 httpd.conf 是空的

    我最近在 ubuntu 上安装了 apache2 但我有一个问题 我的 httpd conf 是空的 有人能给我一份 ubuntu 上 apache2 的 httpd conf 的干净副本吗 谢谢 编辑 我看到了你的答案 但在 wampse
  • 如何让dput删除多余的数据?

    我想要一个 SO 问题的最小可重现代码 我一直在使用dput droplevels head df 50 然而 df大约有 4k 条记录 看起来像dput正在为每个人打印一些东西 我需要在问题中显示两个不同的 df 所以不会让我超过 30
  • 打字稿中具有数据水合/脱水的类

    我想分享 React TS 前端和 Node TS 后端之间的 TS 类或接口 问题是 TS 类型在编译时被剥离 所以当我想将类实例转换为 JSON 时我无法使用它们 我想知道是否有任何解决方案可以在静态文件中描述我的对象 生成 TS 类