您如何测试JavaScript对象文字是否具有与TypeScript类相同的属性?

时间:2019-05-09 15:37:08

标签: javascript typescript

目标

我想编写一个单元测试,以在运行时验证JavaScript对象是否符合TypeScript类型。我正在寻找一种执行此操作的方法,该方法使我可以描述一次类型,然后再用于TypeScript编译时检查和JavaScript运行时检查。该解决方案必须允许嵌套的类结构。

代码

因为一个代码示例值得一千个单词,所以请参阅“ ???”。对于问题的根源:

目标单元测试

it('object literal and TypeScript class should be compatible, () => {

  ??? psudo-code on line below ???  
  const isCompatible = (myLiteral ~has matching properties with~ MyClass)

  expect(isCompatible).toBeTrue();

});

JavaScript对象文字

var myLiteral = {
  entities: {
    users: {
      '1': { id: 1 },
      '2': { id: 2 }
    }
  }
}

在TypeScript中定义的类

class MyClass {
    entities: Entities;
}

class Entities {
    users: { [key: string]: User };
}

class User {
    id: number;
}

背景

我正在使用normalizer规范化对象。 normalize方法的输出不是强类型的-因此需要使用as关键字才能将输出恢复为强类型。这是将来在不知不觉中将错误引入代码库的潜在点。

我想编写单元测试以验证normalizr的输出是否符合我在TypeScript中使用的已经定义的类型

当前想法

TypeScript接口和类型在运行时不存在...但是,类确实存在,并且类型可以从类派生。我希望有一种方法可以利用这一事实来实现我的目标。也许还有另一种代码生成方式。但是,到目前为止,我一直找不到。或者,也许我在上面提到的整个过程在某种程度上都是错误的,或者我缺少明显的东西。对此欢迎表示反馈。

1 个答案:

答案 0 :(得分:0)

项目Typescript Json Schema从TS类生成JSON模式。这些可以在运行时用于验证JS对象文字。

我已经使用该库来验证API的输入并生成合理的响应(例如,输入entities对象缺少属性MyClass)。