Angular 12类型报错:'(response: IAppConfig)=>void'参数无法分配给指定类型
错误原因
该报错的根因为HttpClient.get()默认的泛型返回类型为Object,未显式指定返回类型的前提下,调用toPromise()后生成的Promise resolve值类型为Object,与then回调中声明的IAppConfig参数类型不匹配,触发TypeScript类型校验失败。
解决方案
- 核心修改:给
http.get()方法添加IAppConfig泛型约束,从源头指定接口返回值类型,无需后续强制类型转换 - 同步修正原代码中Promise构造函数的语法瑕疵,避免不必要的语法报错
- 可选优化:Angular 12 配套的RxJS版本中
toPromise()已被标记废弃,可替换为lastValueFrom符合最新RxJS编码规范
修正后代码(兼容原写法)
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { IAppConfig } from './app-config.model'; @Injectable() export class AppConfig { static settings: IAppConfig; constructor(private http: HttpClient) {} load() { const jsonFile = 'assets/config/config.json'; return new Promise<void>((resolve, reject) => { // 核心修改:给get方法添加<IAppConfig>泛型 this.http.get<IAppConfig>(jsonFile).toPromise().then((response) => { AppConfig.settings = response; resolve(); }).catch((response: any) => { console.log('Configuration file could not be read'); resolve(); }); }); } }
推荐优化写法(替换废弃toPromise)
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { IAppConfig } from './app-config.model'; import { lastValueFrom } from 'rxjs'; @Injectable() export class AppConfig { static settings: IAppConfig; constructor(private http: HttpClient) {} async load() { const jsonFile = 'assets/config/config.json'; try { const config = await lastValueFrom(this.http.get<IAppConfig>(jsonFile)); AppConfig.settings = config; } catch (e) { console.log('Configuration file could not be read'); } } }
内容的提问来源于stack exchange,提问作者user1848980
相关产品推荐
相关产品推荐

