如何将已定义的接口与 io-ts 库一起使用?
Posted
技术标签:
【中文标题】如何将已定义的接口与 io-ts 库一起使用?【英文标题】:How to use already defined interface with io-ts library? 【发布时间】:2021-05-04 05:22:37 【问题描述】:我在我的应用程序中使用 @types/fabric 包。我想使用结构类型中的预定义接口(如ICircleOptions
、IRectOptions
..等)。
如何将这些接口与 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”的加载移动到动画帧中,而不是重新加载
将最新版本的 TypeScript 定义与较旧的 JavaScript 库一起使用
如何将自定义 Cloud Builders 与来自 Google Artifact Repository 的图像一起使用