如何在Visual Studio Code中禁用Angular测试文件的类型检查
解决Angular Jest模拟类的类型检查报错问题
我懂你现在的困扰:用Jest模拟Apollo、HttpLink这类类的时候,明明运行时模拟逻辑没问题,但VS Code里的TypeScript类型检查却因为模拟构造函数不符合原类的参数要求,一直弹出红色错误。下面给你两种可行的解决方案:
方案一:临时禁用当前测试文件的类型检查
如果想快速搞定眼前的报错,可以在测试文件的最顶部加一行注释:
// @ts-nocheck
这会让TypeScript直接跳过整个文件的类型校验。不过要提醒你,这是个“治标不治本”的办法,可能会掩盖其他潜在的类型问题,所以更推荐下面的规范做法。
方案二:让模拟类适配原类型定义(推荐)
你可以调整Jest的模拟逻辑,让构造函数兼容原类的参数要求(哪怕内部完全忽略这些参数),这样就能通过TypeScript的类型检查,同时不影响Jest的模拟效果。
修改你的代码如下:
import { Apollo } from 'apollo-angular' jest.mock('apollo-angular', () => { return { Apollo: jest.fn().mockImplementation(() => { return { create: jest.fn() } }) } }) import { HttpLink } from 'apollo-angular-link-http' jest.mock('apollo-angular-link-http', () => { return { // 让模拟构造函数接受原类要求的参数(用下划线标记为未使用) HttpLink: jest.fn().mockImplementation((_options?: any) => { return { create: jest.fn() } }) } }) import { GraphqlService } from './graphql.service' describe('GraphqlService', () => { let apollo = new Apollo() // 传入符合类型要求的参数(空对象就行,模拟逻辑里不会用到) let httpLink = new HttpLink({}) let graphqlService beforeAll(() => { graphqlService = new GraphqlService(apollo, httpLink) }) it('should be created', () => { expect(graphqlService).toBeTruthy() }) it('should create apollo client correctly', () => { expect(apollo.create).toHaveBeenCalled() }) })
这里用mockImplementation定义了构造函数的逻辑,让它接受原类要求的参数(用_options表示这个参数不会被使用),这样TypeScript就不会再挑刺,同时Jest的模拟依然能正常捕获方法调用。
要是你实在不想传参数,也可以用类型断言临时绕过检查,但这种方式不够优雅:
let httpLink = new (HttpLink as any)()
总的来说,方案二更值得推荐,既能解决当前的报错,又能保持代码的类型安全性,避免遗漏其他潜在问题。
内容的提问来源于stack exchange,提问作者Thomas Betous
相关产品推荐
相关产品推荐

