【发布时间】:2020-08-27 13:06:54
【问题描述】:
我有一个获取输入数据的服务器应用程序,作为 javascript 对象。我需要检查这些数据是否满足以下要求:
- 它具有由接口定义的必填字段
- 这些字段属于特定类型
- 对象只有列出的字段,没有别的
我发现了 2 个对实现目标非常有帮助的库:
例如使用 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 是一个非常有用的库,因为它可以同时具有 Runtime 和 Compile time em> 验证使用相同的描述符(PropSchema),我不需要定义它两次,但我不知道如何检查无效的对象成员。 IO-TS也有同样的能力,不过我还没试过。
【问题讨论】:
-
您是在询问要使用哪些库,还是您想自己编写代码来执行此操作?无论哪种方式,我都鼓励您提供一个minimal reproducible example,该minimal reproducible example 要么没有第三方依赖项,例如 io-ts 或 runtypes,要么已经在您可以链接到我们的 Web IDE 中配置了此类依赖项。现在,我自己尝试设置它来玩弄它并提出具体建议对我来说工作量太大了。
-
同意,请修改您的问题并使其特定于运行类型,如果您需要,我刚刚创建了标签。像“这个库比另一个库更好吗?”这样的问题不应该在stackoverflow上问。如果需要,请查看指南。
-
我认为问题很明确:是否有任何库可以进行运行时检查和过滤具有不存在成员的对象的能力?