如何将已定义的接口与 io-ts 库一起使用?

Posted

技术标签:

【中文标题】如何将已定义的接口与 io-ts 库一起使用?【英文标题】:How to use already defined interface with io-ts library? 【发布时间】:2021-05-04 05:22:37 【问题描述】:

我在我的应用程序中使用 @types/fabric 包。我想使用结构类型中的预定义接口(如ICircleOptionsIRectOptions ..等)。

如何将这些接口与 io-ts 库一起使用以进行运行时类型检查。

我已经定义了一个这样的类型:

const Response = t.type(
  id: t.number,
  type: t.string,
  objects: t.array(t.union([ICircleOptions, IRectOptions]))
)

我想使用结构预定义接口来定义我的对象数组的类型。

我已经通过https://github.com/gcanti/io-ts/issues/209 并且 io-ts 的作者在那里分享了示例,但在我的情况下不起作用。

请告诉我,这可能吗?谢谢。

【问题讨论】:

【参考方案1】:

您必须为 fabric 提供的类型定义编解码器。例如:

import * as t from "io-ts/Codec";
import  ICircleOptions  from "fabric/fabric-impl";
import  Either  from 'fp-ts/Either'

export const codecICircleOptions= t.type( // or export const ICircleOptions if you like
  radius: t.number,
  startAngle: t.number,
  endAngle: t.number
);

export const example: Either<unknown, ICircleOptions> = codecICircleOptions.decode()

// ....

const Response = t.type(
  id: t.number,
  type: t.string,
  objects: t.array(t.union([codecICircleOptions, codecIRectOptions]))
)

【讨论】:

如 readius、startAngle、endAngle 已在 ICircleOptions 中从 fabri-types 中定义。那为什么我需要为此再次编写 codecICircleOptions 呢?它们应该来自面料类型 fabric 只是提供类型定义。不是编解码器。编解码器是实际值,而不是类型。编译成 javascript 时类型会被移除,而编解码器(具有函数的对象)会保留。 虽然没有办法直接使用现有的类型/接口声明作为io-ts 类型(因为如前所述,它们在运行时不存在),有几个现有的库用于 生成来自上述声明的io-ts 代码: - github.com/juusaw/ts-to-io - github.com/gcanti/io-ts-codegen 可能还有更多,但这是我所知道的两个。我曾多次使用ts-to-io 来帮助将我的一些之前的io-ts 代码移植到io-ts,但不是最近。 YMMV

以上是关于如何将已定义的接口与 io-ts 库一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

html 这是与Ember一起使用的示例“index.html”。它将已编译的“vendor.js”的加载移动到动画帧中,而不是重新加载

jetty SSL如何与java密钥库和多个别名一起使用

将最新版本的 TypeScript 定义与较旧的 JavaScript 库一起使用

如何将自定义 Cloud Builders 与来自 Google Artifact Repository 的图像一起使用

zlib1.2.11静态库使用

如何在 Access 2007 中使用 Access 2003 mde 并保留我的自定义菜单/工具栏?