【问题标题】:Using Typescript, Type guard and reflection to validate objects against types使用 Typescript、类型保护和反射来针对类型验证对象
【发布时间】:2017-03-30 16:41:43
【问题描述】:

我正在尝试 DRY,通过使用 ES6、Typescript,我创建了一个接口,将其称为具有属性的 IUser。

  • 在运行时了解对象是否符合接口的最佳方法是什么?
  • 如何获取错误列表? IDE 知道缺少哪些属性,为什么我不知道?

我见过使用反射和其他技术的示例,它们一次测试一个属性。但是必须有一种方法可以轻松地知道一个对象是否实现了所有属性,如果没有实现哪些属性。

我知道有些属性是可选的 '?'而且我们知道类型,这应该是可能的!

type IUser = {
    name: string
    age?: number
    gender: string | any
}

// Assume this object gets created at runtime.
let john = {
    name: "John"
}

let errors = ValidateThis(john, IUser)
// Return something like this ["Error: Missing value gender", "Warning: Missing optional value age"]
  • 我不想指定每个属性,所以必须有一种方法来迭代类型属性。
  • 我不想使用我发现的任何强制我创建的现有 npm 项目,而是一个单独的架构文件或使用一个类。

【问题讨论】:

标签: javascript typescript ecmascript-6


【解决方案1】:

你不是第一个提出这个要求的人。接口在运行时不存在,因为编译时 TS fully erases all type information

然而,ECMAScript 有一个标准跟踪反射 API,TypeScript 就在其中。完成此操作的最佳选择是使用experimentalDecoratorMetadata 自动使用类型信息装饰您的类,然后在运行时使用reflection API 进行验证。 (Ctrl-f 并搜索experimentalDecoratorMetadata)。

【讨论】:

    【解决方案2】:

    这不存在。您应该使用现有的 NPM 项目之一,或者编写另一个。

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 2021-12-20
      • 2015-09-26
      相关资源
      最近更新 更多