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

How can I test a property on an object that may be of two different types using Jest and TypeScript?

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

我有一个开玩笑的单元测试,其中包括一个 属性 的测试,它存在于其中一种类型上,但不存在于另一种类型上。在这种情况下,Banana 有 属性 peelApple 没有。

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