【问题标题】:How to get warnings/errors list for invalid types/type mismatch on class transformer如何在类转换器上获取无效类型/类型不匹配的警告/错误列表
【发布时间】:2021-02-17 04:17:53
【问题描述】:

Class transformer library 提供了将 json 格式的普通 javascript 对象转换为 ES6 类的函数

但是我看到当json对象中的类型和类中定义的类型不匹配时它不会抛出任何错误

类如下所示

class MyClass {
  id: string;
  name: string;
  age: number; // here is where i put a "abc" to test
  @Type(() => Date)
  date: Date;
}

在 myclass2 上它可以正常工作,因为 age(23) 是一个数字。但在 myclass1 中,年龄设置为“abc”,不能转换为类中定义的数字类型。然而代码通过没有任何错误。

    const json1 = {id: "123", name: "bob", age: "abc", date: "12/15/2019"};
    const json2 = {id: "123", name: "bob", age: 23, date: "12/15/2019"};
    const myclass1 = plainToClass(MyClass, json1);
    const myclass2 = plainToClass(MyClass, json2);
    console.log("myclass1", myclass1);
    console.log("myclass2", myclass2);

在控制台日志中可以看到虽然年龄的类型已经明确定义,但年龄的值仍然可以设置为字符串。

console log image here(我没有足够的RP点来附加一个url,这是一个新帐户)

我的问题是如何获得有关此类不匹配的警告/错误列表。

感谢您的帮助。

https://stackblitz.com/edit/class-transformer-auuhvs

【问题讨论】:

  • 文档很清楚,它只是一个简单的serdes库,还有does not do type checking or coercion unless you enable it
  • 好的,但是它没有提到当它无法转换为打字稿类型时的行为是什么。所以答案是类转换器在将 json 对象转换为 typescript 类时并没有真正进行类型检查并给出错误列表?
  • 运行时没有“打字稿类型”。它只是按原样使用输入值。生成的类实例将只是具有错误的属性,就像您所经历的那样。

标签: javascript typescript class-transformer


【解决方案1】:

仅使用类转换器库是不可能做到这一点的。

class-transformer-validator 库需要按照 npm 包的 README 文档中描述的方式使用。

简而言之,类的每个属性都必须使用特定的验证器注释进行注释。在这种情况下,我们使用@IsString@IsNumber

class MyClass {
  @IsString()
  id: string;
  @IsString()
  name: string;
  @IsNumber()
  age: number;
  @Type(() => Date)
  date: Date;
}

然后使用验证器库中的方法对其进行验证,如下所示。

    transformAndValidate(MyClass, json1)
      .then((classObject: MyClass) => {
        // now you can access all your class prototype method
        console.log("validated class1", classObject);
      })
      .catch(err => {
        // here you can handle error on transformation (invalid JSON)
        // or validation error (e.g. invalid email property)
        console.error("validation error class1:", err);
      });

如果存在验证错误,则结果是一个列表。对于像下面这样的 json1,我预计会出现一个验证错误,即年龄不是 json 中的数字。

 const json1 = { id: "123", name: "bob", age: "abc", date: "12/15/2019" };

结果与您在下面的屏幕截图中看到的完全一样。您可以在错误的“约束”属性上查看反序列化和验证器期间遇到的确切错误。 error message screenshot(图片是链接,因为我没有足够的RP)

可以在下面的同一链接中看到验证错误的演示。 https://stackblitz.com/edit/class-transformer-fxk9ay?file=src%2Fapp%2Fapp.component.ts

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 2019-11-03
    • 2020-07-28
    • 1970-01-01
    • 2014-11-10
    • 2023-03-31
    • 1970-01-01
    • 2023-04-01
    • 2013-06-10
    相关资源
    最近更新 更多