【问题标题】:Enforcing types on untyped data in TypeScript在 TypeScript 中对无类型数据强制执行类型
【发布时间】:2023-03-08 15:09:01
【问题描述】:

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

例子:

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

interface SuperCresBody {
    name: string,
    yoyo: boolean,
}

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

在一个有点相关的注释中,在most recent episode of Functional Geekery 中,Matthias Felleisen 在剧集结尾附近的 Typed Racket 中解释了类似的需求。

相关阅读:

【问题讨论】:

  • 某种相关的...代码生成对此很有用。我一直在研究this,它允许您从代码中获取信息、修改它,然后编写新代码(仍然需要大量工作......这是一项艰巨的任务)。然后是this,它允许您生成客户端代码以从服务器端代码访问服务器。不过目前它还没有经过很好的测试,而且还处于实验阶段……我写得非常快,以展示这个概念。
  • 运行时检查的问题是它会消耗你的CPU资源来执行。不过还是可以的。
  • @BotMaster,我不希望运行时类型检查所有内容,但主要检查来自应用程序边界的数据(例如 HTTP 请求、文件 I/O)。我不介意手动操作,这是无论如何都必须完成的,但利用 TypeScript 中类型注释提供的类型信息会很好。
  • 请看我对this question的回答。现在可以对 TypeScript 中的接口进行运行时检查。

标签: typescript runtime-error static-typing


【解决方案1】:

检查这两个等效项目:

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

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

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

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

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

http://json2ts.com/

【讨论】:

    猜你喜欢
    • 2020-05-12
    • 2022-01-11
    • 2011-04-24
    • 2020-05-26
    • 1970-01-01
    • 2023-01-18
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多