You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:34:42