从TypeScript类型/接口生成Joi架构

11
我想从Typescript类型或接口生成一些joi模式对象。在我的初步搜索中,我发现有一些相反的东西(从joi模式生成Typescript类型/接口),以及ts-interface-builder + ts-interface-checker提供了一些基于Typescript类型/接口创建运行时检查器的能力,但仍然缺乏功能支持,还有一堆围绕属性/方法使用类和装饰器来完成这个任务的复杂事情。
是否有类似的工具可以生成这样的joi模式?或者有更成熟的替代方案来进行接口/类型的运行时检查?(从数据库中获取数据并确保DB返回的响应结构正确时非常有用)
编辑:我想这里有一个关于这种问题的很好的讨论线程this io-ts github issue

Typescript不是一种运行时语言。当它被编译成JS时,所有的typescript都会被剥离。JOI有什么问题吗?我在商业级别的typescript项目中使用它,并总是使用JOI来验证模式。 - MonteCristo
1
我认为io-ts属于具有运行时检查的替代方案类别。 - cbr
1
@MonteCristo 我知道 TypeScript 的接口和类型会被转译掉。JOI 没有问题,我只是想对一些未知的对象结构(例如来自数据库)进行运行时检查,并能够在运行时检查它是否符合 TypeScript 接口。我宁愿先写 TypeScript 而不是 JOI。 - n8jadams
Joi模式比TS类型更严格,也许从模式生成TS类型会更好 :] - felixmosh
@felixmosh 那么,从TS类型生成joi模式不是更容易吗?基本上,我只需要具有类型属性的对象,并且某些字段是必需的。 - n8jadams
1个回答

7
我已经找到了一种令我满意的解决方案:typescript-is
  1. 使用ttypescript替换你正在使用的typescript编译器。不要调用tsc,而是调用ttsc
  2. 将以下内容添加到tsconfig.json中:
{
    "compilerOptions": {
        // Rest of ts config options...
        "plugins": [
            {
                "transform": "typescript-is/lib/transform-inline/transformer"
            }
        ]
    }
}
  1. $ npm install ttypescript typescript-is
  2. 现在,您可以将以下内容添加到您的代码中:
import { is, assertType } from 'typescript-is'

interface SomeInterfaceOrType {
    aString: string
}

// To do a simple boolean check, do the following:
const nonConformingObj = { somethingOutOfLeftField: 42 }
const conforms = is<SomeInterfaceOrType>(nonConformingObj) // false

// Or to get better details on what's wrong, do the following
const anotherNonConformer: unknown = { aString: 1337 }
try {
    assertType<SomeInterfaceOrType>(anotherNonConformer)
} catch(error) {
    console.log(error.message) // logs: "validation failed at anotherNonConformer.aString: expected a string"
}

在编译时,is<T>()assertType<T>() 调用将被转换为有效的运行时检查。虽然不是 JOI 模式,但仍然非常整洁,对于我的使用场景来说绝对足够好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接