在 TypeScript 中对非类型化数据强制执行类型

jpi*_*son 5 runtime-error static-typing typescript

我想知道在使用 TypeScript 时是否有任何工具或技术用于对对象数据进行低级验证。一个示例是 HTTP 服务上的 POST 请求的 JSON 正文。通常,我会为预期数据创建一个接口,然后将数据转换到该接口,但我知道这很肤浅。

例子:

router.route('/supercres')
    .get((req, res, next) => {
        const typedBody = <SuperCresBody>req.body;
    })

interface SuperCresBody {
    name: string,
    yoyo: boolean,
}
Run Code Online (Sandbox Code Playgroud)

强制执行接口的问题在于 TypeScript 只是一个编译时概念,在运行时不会强制执行任何内容。知道这一点,我很好奇是否有人找到了一种不需要大量样板或工具的聪明方法,以便在运行时完成这些事情的类型检查,而不必将接口契约作为一组命令性检查作为验证步骤来重复。

与此相关的一点是,在最新一集的 Function Geekery中,Matthias Felleisen 在该集末尾附近解释了 Typed Racket 中的类似需求。

相关阅读:

Ben*_* B. 3

检查这 2 个等效项目:

我使用最新的,它工作完美,但前者看起来也很棒。

在这两种情况下,您都会构建一个验证器,用于:

  • 在运行时检查对象
  • 提取可在编译时使用的静态类型

在您的特定 (api) 用例中,您还可以使用一些工具从您生成的 JSON 或 XML 中提取 TS 类型

您还可以从 JSON 数据轻松生成类型:

http://json2ts.com/