React Router测试中createMemoryHistory的类型与作用域异常问题
问题原因与解决方案
这个问题核心是TypeScript类型推断规则和变量作用域的交互导致的,结合你使用的history v5.3.0和react-router-dom v6.3.0版本,具体原因如下:
当你在
beforeEach中给外部作用域(比如describe块顶层、测试文件全局)的history变量赋值时,TypeScript会默认把变量类型推断为最宽泛的History接口——这是history包中所有历史对象的基类,但它本身不包含location属性,location是MemoryHistory、BrowserHistory这类具体实现子类才有的专属属性。所以此时你访问history.location会触发类型错误,运行时也会因为类型检查限制导致pathname找不到。而把
history定义在测试用例(it/test)内部时,TypeScript会根据createMemoryHistory()的返回值精确推断出变量类型是MemoryHistory,自然能正常访问location和pathname。
解决办法
只需要给外部作用域的history变量显式指定具体类型即可:
import { MemoryHistory, createMemoryHistory } from 'history'; // 显式声明类型为MemoryHistory let history: MemoryHistory; beforeEach(() => { history = createMemoryHistory(); }); test('你的测试用例', () => { // 现在可以正常访问history.location.pathname了 expect(history.location.pathname).toBe('/'); });
或者在赋值时通过类型断言明确类型:
let history; beforeEach(() => { history = createMemoryHistory() as MemoryHistory; });
这样不管是TypeScript类型检查还是运行时,都能正确识别history的具体类型,解决属性访问异常的问题。
内容的提问来源于stack exchange,提问作者C_Z_
相关产品推荐
相关产品推荐

