javascript - 使用 Typescript、类型保护和反射来根据类型验证对象

标签 javascript typescript ecmascript-6

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

  • 在运行时了解对象是否符合接口(interface)的最佳方法是什么?
  • 如何获得错误列表? 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 项目,这会迫使我创建一个单独的架构文件或使用一个类。

最佳答案

您不是第一个提出此要求的人。接口(interface)在运行时不存在,因为 TS fully erases all type information在编译期间。

但是,ECMAScript 有一个符合标准的反射 API,TypeScript 也有它。实现此目的的最佳选择是使用 experimentalDecoratorMetadata 自动使用类型信息装饰您的类,然后使用 reflection API在运行时进行验证。 (Ctrl-f 并搜索 experimentalDecoratorMetadata)。

关于javascript - 使用 Typescript、类型保护和反射来根据类型验证对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43123735/

相关文章:

javascript - fadeIn/FadeOut 与 bootstrap (CSS) 重叠的 div

javascript - React 获取数据丢失

javascript - 使用登录 NodeJS 保护目录

javascript - 为什么 typescript ReadonlyArrays 在编译为 javascript 时是 mutlabe

javascript - 在 NativeScript 中在 "Text - Link"上设置标签

node.js - 如何在node.js中使用module.exports导出多个函数

Javascript - jquery, Accordion

html - Angular 6 形式类型错误 : Cannot read property 'valid' of null

javascript - React 路由器在新路线上不显示任何内容

javascript - 允许用户在上下文中修改导入的 ES6 模块函数