Angular项目中WebStorm报TS2339:Object不存在created_at属性的咨询
解决Angular中HttpClient请求返回对象的TS2339类型错误
这个问题其实是TypeScript的类型检查在起作用——虽然运行时JavaScript能正常读取created_at属性,但TypeScript不知道你从GitHub API拿到的响应具体有哪些字段,默认把响应推断成了Object类型,而Object本身并没有created_at这个属性,所以编辑器会抛出TS2339错误。
下面给你两种靠谱的解决办法,推荐第一种:
方法一:定义接口指定响应类型(推荐)
先创建一个接口来描述GitHub用户数据的结构,把你需要用到的字段都写进去:
// 可以放在服务文件里,或者单独的类型文件中 interface GithubUser { created_at: string; // 按需添加其他你需要的字段,比如: id: number; login: string; avatar_url: string; name: string; }
然后修改你的getUser方法,利用HttpClient的泛型特性直接指定返回类型,连多余的map都可以去掉:
getUser(username: string) { return this.http.get<GithubUser>(`https://api.github.com/users/${username}`); }
现在当你订阅这个方法的返回值时,TypeScript就知道user是GithubUser类型,不仅不会报错,IDE还能给你提供字段的自动补全:
this.githubService.getUser('dasunpubudumal') .subscribe(user => { console.log(user.created_at); // 完美解决红线错误 });
方法二:使用类型断言(临时应急用)
如果你不想定义接口,也可以用类型断言直接告诉TypeScript这个对象包含created_at属性,但这种方法会失去TypeScript的类型检查优势,不推荐长期使用:
方式1:在订阅时断言
this.githubService.getUser('dasunpubudumal') .subscribe(user => { console.log((user as { created_at: string }).created_at); });
方式2:在服务的map中断言
getUser(username: string) { return this.http.get('https://api.github.com/users/'.concat(username)) .map(res => res as { created_at: string }); }
总结一下,定义接口的方式更规范,能让你的代码更健壮,还能享受TypeScript的类型提示,是最佳实践。
内容的提问来源于stack exchange,提问作者Dasun Pubudumal
相关产品推荐
相关产品推荐

