如何使用Jest和TypeScript测试两种不同类型对象的属性?



我有一个函数getFruit(),它返回两种可能的类型,Banana | Apple

我有一个简单的单元测试,它包含一个存在于一个类型上的属性的测试,而不存在于另一个类型上。在本例中,Banana具有peel的属性,而Apple没有。

test(`gets a banana`, () => {
const fruit = getFruit(id)
expect(fruit?.peel).toBeDefined();
})

我很满意fruit?.peel在第一次引用时可能没有定义,因为我正在测试fruit?.peel在同一行中定义。

然而,TS标记fruit?.peel行有错误:

Property 'peel' does not exist on type 'Banana | Apple'.
Property 'peel' does not exist on type 'Apple'

如何使用Jest和TypeScript测试两种不同类型对象的属性?

我知道我可以用TS -ignore禁用TS编译器,但我希望得到一个修复而不是一个解决方案。

虽然TypeScript不会让你访问一个不存在的属性,但它会让你用in操作符检查它是否存在:

expect('peel' in fruit).toEqual(true);

或者正如jonrsharpe指出的那样,这样做可能更好:

expect(fruit).toHaveProperty('peel');

在失败的情况下输出:

expect(received).toHaveProperty(path)
Expected path: "peel"
Received path: []
Received value: {"cultivar": "braeburn"}

而不是:

expect(received).toEqual(expected) // deep equality
Expected: true
Received: false

最新更新