0

类转换器库提供了将 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);

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

控制台日志图像在这里(我没有足够的 RP 点来附加一个 url,它是一个新帐户)

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

谢谢您的帮助。

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

4

1 回答 1

0

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

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" };

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

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

于 2021-04-19T10:16:32.470 回答