如何测试JavaScript对象文字是否具有与TypeScript类相同的属性? 目标
我想编写一个单元测试,在运行时验证JavaScript对象是否符合TypeScript类型。我正在寻找一种方法来实现这一点,它允许我描述一次类型,然后在随后的TypeScript编译时检查和JavaScript运行时检查中使用它。解决方案必须允许嵌套类结构 代码 因为一个代码示例值1000个单词。。。有关问题的根源,请参见“?”: 目标单元测试如何测试JavaScript对象文字是否具有与TypeScript类相同的属性? 目标,javascript,typescript,Javascript,Typescript,我想编写一个单元测试,在运行时验证JavaScript对象是否符合TypeScript类型。我正在寻找一种方法来实现这一点,它允许我描述一次类型,然后在随后的TypeScript编译时检查和JavaScript运行时检查中使用它。解决方案必须允许嵌套类结构 代码 因为一个代码示例值1000个单词。。。有关问题的根源,请参见“?”: 目标单元测试 it('object literal and TypeScript class should be compatible, () => {
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类相同的属性?”(我将建议的标题更改为粗体)无论如何,是否要确保两个对象的所有属性都具有相同的类型?如果有额外的属性,会发生什么?它是否仍被视为符合该类型?