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

如何测试JavaScript对象文字是否具有与TypeScript类相同的属性? 目标,javascript,typescript,Javascript,Typescript,我想编写一个单元测试,在运行时验证JavaScript对象是否符合TypeScript类型。我正在寻找一种方法来实现这一点,它允许我描述一次类型,然后在随后的TypeScript编译时检查和JavaScript运行时检查中使用它。解决方案必须允许嵌套类结构 代码 因为一个代码示例值1000个单词。。。有关问题的根源,请参见“?”: 目标单元测试 it('object literal and TypeScript class should be compatible, () => {

我想编写一个单元测试,在运行时验证JavaScript对象是否符合TypeScript类型。我正在寻找一种方法来实现这一点,它允许我描述一次类型,然后在随后的TypeScript编译时检查和JavaScript运行时检查中使用它。解决方案必须允许嵌套类结构

代码 因为一个代码示例值1000个单词。。。有关问题的根源,请参见“?”:

目标单元测试

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();

});

class MyClass {
    entities: Entities;
}

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

class User {
    id: number;
}

JavaScript对象文字

var myLiteral = {
  entities: {
    users: {
      '1': { id: 1 },
      '2': { id: 2 }
    }
  }
}
在TypeScript中定义的类

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();

});

class MyClass {
    entities: Entities;
}

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

class User {
    id: number;
}

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

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

当前想法 运行时不存在TypeScript接口和类型。。。但是,类可以,类型可以从类派生。我希望有办法利用这一事实来实现我的目标。或许还有另一种编码方式。然而,到目前为止,我一直无法找到一个。或者也许我在上面所说的整个过程在某种程度上是错误的,或者我遗漏了一些明显的东西。对这些欢迎的反馈。

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


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

我认为问题的标题具有误导性。JavaScript(ES6及更高版本)也有类,我认为这些类与TypeScript类不同。我试图通过更新代码示例使其更加明确,并将其移至文章的顶部来增加清晰度。希望这有助于更好地消除javascript/typescript类的混淆。我认为您的单元测试概念可能已经过时,或者我可能误解了您的问题,但在我的项目中,我们使用的断言似乎就是您所要寻找的,您可以使用与
literal.should().be().equalTo类似的api({json object})
还有其他api可以检查道具等。这可能是您所需要的。我认为如果您将其命名为“如何测试javascript对象文字是否具有与typescript类相同的属性?”(我将建议的标题更改为粗体)无论如何,是否要确保两个对象的所有属性都具有相同的类型?如果有额外的属性,会发生什么?它是否仍被视为符合该类型?