Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有async和await:变量的Typescript在赋值之前使用。ts(2454)_Typescript_React Testing Library - Fatal编程技术网

带有async和await:变量的Typescript在赋值之前使用。ts(2454)

带有async和await:变量的Typescript在赋值之前使用。ts(2454),typescript,react-testing-library,Typescript,React Testing Library,为什么typescript在这里抱怨变量未赋值?我是不是遗漏了一些关于示波器的明显信息 test('test', async () => { let renderResult: RenderResult; await act(async () => { renderResult = render(<Component />); }); await act(async () => { renderResult.rerender(<

为什么typescript在这里抱怨变量未赋值?我是不是遗漏了一些关于示波器的明显信息

test('test', async () => {
  let renderResult: RenderResult;
  await act(async () => {
    renderResult = render(<Component />);
  });

  await act(async () => {
    renderResult.rerender(<Component />);
  });
  // ERRROR: Variable 'renderResult' is used before being assigned.ts(2454)
  expect(renderResult.container.firstElementChild!.getAttribute('src')).toBe('original');
});
test('test',async()=>{
let renderResult:renderResult;
等待动作(异步()=>{
renderResult=render();
});
等待动作(异步()=>{
renderResult.rerender();
});
//错误:变量“renderResult”在赋值之前使用。ts(2454)
expect(renderResult.container.firstElementChild!.getAttribute('src')).toBe('original');
});

编译器会抱怨,因为它未定义,并且您在使用它之前没有检查它。此外,如前所述,编译器无法知道异步函数内部发生了什么,因此无法知道是否最终分配了异步函数

您只需使用
expect(renderResult?.container?.firstElementChild!.getAttribute('src')).toBe('original')


因此,如果该链中的任何内容未定义,您将得到“false”。

另一种解决方案是将
renderResult
标记为
renderResult
未定义的
,然后在末尾使用可选链接访问它

test('test', async () => {
  let renderResult: RenderResult | undefined
  await act(async () => {
    renderResult = render(<Component />);
  });

  await act(async () => {
    renderResult.rerender(<Component />);
  });
  // ERRROR: Variable 'renderResult' is used before being assigned.ts(2454)
  expect(renderResult?.container.firstElementChild!.getAttribute('src')).toBe('original');
});
test('test',async()=>{
let renderResult:renderResult |未定义
等待动作(异步()=>{
renderResult=render();
});
等待动作(异步()=>{
renderResult.rerender();
});
//错误:变量“renderResult”在赋值之前使用。ts(2454)
expect(renderResult?.container.firstElementChild!.getAttribute('src')).toBe('original');
});

您将收到此错误,因为您的tsconfig.json中有。因此,编译器向您显示变量可能具有未定义的值

这里的选项是

  • 要使用实例初始化变量(或空值,如字符串的
    ,数组的
    []
    ,等等)
  • 使用 (
    expect(renderResult!.container.firstEleme…
  • 禁用
    strictNullChecks
    在tsconfig.json中
  • 或任何其他方式 检查未定义的值或断言该值未定义

如果您使用的是 StuttUnLtCuffs<代码>,您应该考虑使用null对象模式。

AFAIK Type Script不分析ACT函数。
已到达。好的,很公平。但是我应该如何重新构造代码?目前我使用了@ts ignore,这似乎有帮助,但是…我有一个相同的问题:)。现在,你可以说renderResult!无论编译器在哪里抱怨。