TypeScript编写日期mock测试时出现'string | Date'类型赋值报错
TypeScript测试报错根因
这个报错完全是TS对测试用例数组的过宽自动类型推导导致的,和被测函数的业务逻辑没有关系。
具体报错触发逻辑
- 直接调用
Array.of()传入多组测试用例时,没有给数组声明固定的元组结构,TS会自动把整个数组推导为「元素为(string | Date)[]的数组」——不会约束每个子测试用例必须是3个元素的固定结构,只会把所有子元素的可能类型合并成联合类型。 - 解构
testCase得到的两个变量因此触发类型不匹配:testName的推导类型包含Date、数字、字符串的联合类型,无法满足test()方法要求第一个入参必须是string的约束todayDate的推导类型为string | Date的联合类型;而getDay的第二个参数因为有默认值new Date(),被TS自动推导为固定的Date类型,因此触发'string | Date' is not assignable to parameter of type 'Date'的报错。
可直接落地的修复方式
- 给
Array.of()加上显式的泛型标注,明确每个测试用例是固定长度的元组,指定每个位置的固定类型:Array.of<[testName: string, mockToday: Date, expectedResult: string]>( // 原有的测试用例内容不需要改动 ) - 也可以在解构变量时加类型断言兜底,解决TS推导偏差:
const [testName, todayDate, expectedResult] = testCase as [string, Date, string]
注意:不需要修改被测函数的参数定义,这个问题完全来自测试代码的类型声明缺失。
内容的提问来源于stack exchange,提问作者Prashant Reddy
相关产品推荐
相关产品推荐

