Bigint、Angular 和 HttpContext

Bigint, Angular and HttpContext

我目前来自 ASP.Net MVC,试图为我的控制器端点构建一个 Angular 应用程序。然而,我的模型;包含一个ulong。这很好,我想,因为通过控制器发送的 JSON 已正确设置此值。然而;到达 Angular 后,该值已损坏,与应有的值相差约 50。

后来,我发现这是由于Javascript对数字大小的限制。奇怪的是,我在 Angular 中的所有模型都设置为 bigints,而不是数字。

很可能 Angular 中的 JSON 反序列化器将这些 ulongs 视为数字,而不是 bigints,这会通过 JavaScript 的 safe/unsafe 导致这种损坏大小限制。但是,到目前为止,bigint 已经在规范中出现了几年,我想知道是否有任何解决方法?

我查看了这个问题的最后一个 Whosebug 答案,但其中很多答案来自之前 bigint 被正式引入为数据类型。

对于上下文,这是我在 Angular 中用来获取我的用户数据的内容:

  private currentUserSubject = new ReplaySubject<any>();
  currentUser$ = this.currentUserSubject.asObservable();
  private init = false;

  constructor(private http: HttpClient, private router: Router, private cookieService: CookieService, private toastr: ToastrService) { }

  loadUserConfig() {
    this.http.get(API_URL + '/users/@me').subscribe((data) => {
      this.currentUserSubject.next(data);
    }, (error) => {
      this.currentUserSubject.error(null);
      this.handleError(error);
    });
  }

  getUserProfile(reinit: boolean = false): Observable<AppUser> {
    if (reinit || ( !this.init && this.isLoggedIn())) {
      this.init = true;
      this.loadUserConfig();
    }
    return this.currentUser$;
  }

其中 AppUser 是一个包含另一个模型的模型,该模型具有相关的 bigint 值。即:

export interface Guild {
  id: bigint;
}

export interface AppUser {
  adminGuilds: Guild[];
}

原始发送数据:

{"adminGuilds":[{"id":613441321751019550}]}

我意识到我可以将它们作为字符串发送,但在我看来,将它们作为 ulong 发送并将它们存储为 bigin 是一个更优雅的解决方案,而不是必须创建与其对应的模型相同的单独视图模型但使用字符串而不是 ulongs。

-Ferox

BigInt in JS/TS 是通过将 n 附加到整数文字的末尾创建的。尽管您使用 bigint 类型来表示您的大数字,但它们仍被视为数字,因此您会看到数字数据丢失。

考虑一下:

interface Guild {
  id: bigint;
}

 interface AppUser {
  adminGuilds: Guild[];
}

const a: AppUser = {"adminGuilds":[{"id":613441321751019550}]};

以上不会在 TS 中编译,因为数字 613441321751019550 不是一个 bignint 而是一个数字(因为最后没有 n。您将得到以下错误:

Type 'number' is not assignable to type 'bigint'.

const a: AppUser = {"adminGuilds":[{"id":613441321751019550n}]};

它会编译正常,如果你登录 alert(a.adminGuilds[0].id) 你不会丢失数据。

您需要做的是在 API 响应中的数字末尾添加 n,以便在 JS/TS 中正确表示为 bigint。