TypeScript用for循环push Promise对象报TS2345 never错误如何解决
报错原因
这个报错是TypeScript的类型推断逻辑导致的:
你初始化数组时直接写let issues = [],此时数组内没有任何元素,TS无法推断数组的元素类型,就会默认将其推断为never[]类型。never是TypeScript的底层类型,代表不可能存在的值,所以不允许你往never[]类型的数组里插入Promise<Issue>类型的元素,就抛出了类型不匹配的错误。
你之前手动初始化数组的时候,因为数组里已经有了createEntity返回的Promise<Issue>元素,TS能直接推断出数组类型是Promise<Issue>[],所以不会报错。
解决方法
方案1:最小改动原代码,手动声明数组类型
只需要给你初始化的issues数组加上显式的类型声明即可:
const seedIssues = (): Promise<Issue[]> => { // 手动声明数组类型 let issues: Promise<Issue>[] = [] for (let i = 0; i < 100; i++){ issues.push( createEntity(Issue, { title: 'Case ' + String(i), }) ) } return Promise.all(issues); };
方案2:用Array.from简化写法,无需手动管理循环变量
你可以用Array.from直接生成目标数组,不需要单独声明空数组再push,TS可以自动推断类型:
const seedIssues = (): Promise<Issue[]> => { return Promise.all( Array.from({ length: 100 }, (_, index) => createEntity(Issue, { title: `Case ${index}` }) ) ) }
内容的提问来源于stack exchange,提问作者Kid_Learning_C
相关产品推荐
相关产品推荐

