Internet Explorer 11中的64位枚举标志

时间:2018-04-23 14:06:22

标签: javascript c# typescript internet-explorer internet-explorer-11

我们正在通过Web API从我们的C#后端向我们的客户端浏览器发送一个64位枚举。该应用程序的一个要求是它应该在Windows 10 x64 with ie11上运行。但是,当我启动ie11时,我得到两个进程,默认情况下为一个64位和一个32位。 64位枚举是否可以与ie11一起使用?如果它不能处理超过32个标记,我们就不会使用枚举选项。

enter image description here

我们正在使用TypeScript处理标志并使用Webpack将其编译为ES5。

What are enum Flags in TypeScript?

我们使用TypeLITE生成TypeScript定义。

http://type.litesolutions.net/

C#型号:

[Flags]
[TsEnum(Module = "Application")]
public enum ValidationErrorType : Int64
{
    None = 0,
    NoCaseForRenewalCycle = 1 << 0, // 1
    RegistrationNumberExists = 1 << 1, // 2
    ApplicationNumberMissing = 1 << 2, // 4
    FeeCalculationNoPrice = 1 << 3, // 8
    //...
}

TypeLite.Net4,Enums.ts:

namespace Application {
    export const enum ValidationErrorType {
        None = 0,
        NoCaseForRenewalCycle = 1,
        RegistrationNumberExists = 2,
        ApplicationNumberMissing = 4,
        FeeCalculationNoPrice = 8
    }
}

1 个答案:

答案 0 :(得分:1)

浏览器处理位数在这里根本不重要。但重要的是javascript没有64位整数这样的东西。 Javascript有number类型,基本上是C#double。因此,javascript无法安全地表示大于2 ^ 53-1(Number.MAX_SAFE_INTEGER常数)的整数。此外,所有位运算符(<<|等)都使用数字作为32位整数,这对于这种情况也没有帮助。例如,1 << 32在javascript中评估为1

因此,您的64位打字稿枚举是一个雷区,可能导致很难检测到错误,因此我会避免它。

如果你无法避免它 - 你必须使用一些能够使用64位数字的库,比如BigJS(但我想你不能使用typescript enum)。