首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bigint角与HttpContext

Bigint角与HttpContext
EN

Stack Overflow用户
提问于 2022-01-31 05:28:42
回答 1查看 236关注 0票数 0

我目前来自ASP.Net MVC,试图为我的控制器端点构建一个棱角的应用程序。然而,我的模型包含一个ulong。我认为这很好,因为通过控制器发送的JSON正确设置了这个值。然而,当它到达角时,它的值就被破坏了,并且比它应该的值少了50。

后来,我发现这是因为Javascript对数字大小的限制。奇怪的是,我所有的模型都是角的,而不是数字。

角形中的JSON反序列化器很可能将这些ulongs视为数字,而不是bigints,这将通过JavaScript的安全/不安全的大小约束导致这种破坏。然而,bigint在规范中已经有几年了,我想知道是否有办法解决这个问题?

我已经为这个问题找到了最后的StackOverflow答案,但其中许多答案来自于bigint正式作为数据类型引入之前。

对于上下文,这是我在context中使用的获取用户数据的方法:

代码语言:javascript
复制
  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值存在问题。IE:

代码语言:javascript
复制
export interface Guild {
  id: bigint;
}

export interface AppUser {
  adminGuilds: Guild[];
}

原始发送的数据:

代码语言:javascript
复制
{"adminGuilds":[{"id":613441321751019550}]}

我意识到,我可以把它们作为字符串发送过来,但把它们作为长龙发送,并以bigints的形式存储它们,在我看来,是一个更优雅的解决方案,我认为,这比创建与模型对应的模型相同但使用字符串而不是长字符串的独立视图模型要好得多。

-Ferox

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-31 06:05:23

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

考虑到这一点:

代码语言:javascript
复制
interface Guild {
  id: bigint;
}

 interface AppUser {
  adminGuilds: Guild[];
}

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

上面不会在TS中编译,因为数字613441321751019550不是一个大号,而是一个数字(因为末尾没有n)。您将得到以下错误:

类型'number‘不能指定键入'bigint’。

代码语言:javascript
复制
const a: AppUser = {"adminGuilds":[{"id":613441321751019550n}]};

它将很好地编译,如果您记录alert(a.adminGuilds[0].id),您将不会丢失数据。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70921614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档