我目前来自ASP.Net MVC,试图为我的控制器端点构建一个棱角的应用程序。然而,我的模型包含一个ulong。我认为这很好,因为通过控制器发送的JSON正确设置了这个值。然而,当它到达角时,它的值就被破坏了,并且比它应该的值少了50。
后来,我发现这是因为Javascript对数字大小的限制。奇怪的是,我所有的模型都是角的,而不是数字。
角形中的JSON反序列化器很可能将这些ulongs视为数字,而不是bigints,这将通过JavaScript的安全/不安全的大小约束导致这种破坏。然而,bigint在规范中已经有几年了,我想知道是否有办法解决这个问题?
我已经为这个问题找到了最后的StackOverflow答案,但其中许多答案来自于bigint正式作为数据类型引入之前。
对于上下文,这是我在context中使用的获取用户数据的方法:
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:
export interface Guild {
id: bigint;
}
export interface AppUser {
adminGuilds: Guild[];
}原始发送的数据:
{"adminGuilds":[{"id":613441321751019550}]}我意识到,我可以把它们作为字符串发送过来,但把它们作为长龙发送,并以bigints的形式存储它们,在我看来,是一个更优雅的解决方案,我认为,这比创建与模型对应的模型相同但使用字符串而不是长字符串的独立视图模型要好得多。
-Ferox
发布于 2022-01-31 06:05:23
JS/TS中的BigInt是通过将n添加到整数文本的末尾来创建的。虽然您使用bigint类型来表示您的大数字,但它们仍然被视为数字,因此您会看到数据在数字中丢失。
考虑到这一点:
interface Guild {
id: bigint;
}
interface AppUser {
adminGuilds: Guild[];
}
const a: AppUser = {"adminGuilds":[{"id":613441321751019550}]};上面不会在TS中编译,因为数字613441321751019550不是一个大号,而是一个数字(因为末尾没有n)。您将得到以下错误:
类型'number‘不能指定键入'bigint’。
const a: AppUser = {"adminGuilds":[{"id":613441321751019550n}]};它将很好地编译,如果您记录alert(a.adminGuilds[0].id),您将不会丢失数据。
您需要做的是在API响应的数字末尾添加n,以便在JS/TS中正确表示为bigint。
https://stackoverflow.com/questions/70921614
复制相似问题