【问题标题】:Typescript object runtime check with a twistTypescript 对象运行时检查
【发布时间】:2020-08-27 13:06:54
【问题描述】:

我有一个获取输入数据的服务器应用程序,作为 javascript 对象。我需要检查这些数据是否满足以下要求:

  • 它具有由接口定义的必填字段
  • 这些字段属于特定类型
  • 对象只有列出的字段,没有别的

我发现了 2 个对实现目标非常有帮助的库:

runtypesio-ts

例如使用 runtypes 我可以创建运行时类型:

const PropSchema = Record({
    uid: String,
    name: String,
    timestamp: Number
});

我可以从 PropSchema 创建一个静态类型:

type PropSchemaInterface = Static<typeof PropSchema>;

从现在开始,我可以像使用接口一样使用它,如果对象无效,打字稿会发出警告:

let props: PropSchemaInterface = { // this is invalid, because name is not a string
    uid: "31293-a7aa216982678",
    name: 4,
    timestamp: (new Date()).valueOf()
}

并检查对象是否满足 PropSchema:

PropSchema.check(props); // returns true

但是

PropSchema.check({
    uid: "12"
});

抛出错误,因为提供的对象中不存在名称和时间戳。这是非常好的。但我确实需要检查输入对象是否只有在 PropSchema 中定义的字段,没有别的。我找不到方法,因为使用此架构:

PropsSchema.check({
    uid: "123-123123123",
    name: "John Snow",
    timestamp: 123123123,
    someKey: "somevalue"
});

也返回true,因为提供的对象满足PropSchemaInterface,但对我来说它是一个无效的对象,因为它有一个未知的键:someKey。我找不到任何可以为我验证它的库。

有什么方法可以按照我想要的方式验证对象吗? Runtypes 是一个非常有用的库,因为它可以同时具有 RuntimeCompile time em> 验证使用相同的描述符(PropSchema),我不需要定义它两次,但我不知道如何检查无效的对象成员。 IO-TS也有同样的能力,不过我还没试过。

【问题讨论】:

  • 您是在询问要使用哪些库,还是您想自己编写代码来执行此操作?无论哪种方式,我都鼓励您提供一个minimal reproducible example,该minimal reproducible example 要么没有第三方依赖项,例如 io-ts 或 runtypes,要么已经在您可以链接到我们的 Web IDE 中配置了此类依赖项。现在,我自己尝试设置它来玩弄它并提出具体建议对我来说工作量太大了。
  • 同意,请修改您的问题并使其特定于运行类型,如果您需要,我刚刚创建了标签。像“这个库比另一个库更好吗?”这样的问题不应该在stackoverflow上问。如果需要,请查看指南。
  • 我认为问题很明确:是否有任何库可以进行运行时检查和过滤具有不存在成员的对象的能力?

标签: typescript typechecking


【解决方案1】:

runtypes 的作者很好地解释了为什么允许无关类型以及 his reply to this issue 目前不支持“精确”类型。

如果您仔细阅读该问题的底部(在撰写此 2021-01-12 时),您会看到有一个 PR 待定,以将其添加为一项功能。添加该功能后,使用该功能将解决您的问题并成为最佳解决方案。

与此同时,如果我处于您的位置,我将针对您的对象添加第二个验证步骤,该步骤将手动迭代您的对象并验证其中没有多余的道具。这很痛苦,但在合并此 PR 之前我能想到的唯一短期解决方法。

【讨论】:

  • 感谢您的回答,这正是我所做的。我完全理解为什么 Runtypes 不严格检查字段,但是这个功能是非常需要的,而且我真的认为不只是我一个人。
猜你喜欢
  • 2016-02-21
  • 2019-04-20
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
相关资源
最近更新 更多