我有一个函数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