【问题标题】:How compatible is (will be) TypeScript to ES6 (ECMAScript 2015)TypeScript 与 ES6 的兼容性如何(ECMAScript 2015)
【发布时间】:2015-10-06 10:15:11
【问题描述】:

我认为 TypeScript(基本上)是带有附加类型注释的 ECMAScript 6(又名 2015)。

我的 TypeScript 编译器 (1.6.2) 抱怨以下代码:

if (calc.distance > Number.EPSILON) {
    ...
}

错误 TS2339:“NumberConstructor”类型上不存在属性“EPSILON”。

打字有问题还是 TypeScript 不是(还)真的是 ES6 的超集?

我还没有尝试过像MapWeakMap、Promises、Generators 这样的尖端技术……

TypeScript 是仅仅落后于 ES6 还是在朝着另一个方向发展?我应该通过 Babel 运行 TypeScript 编译器输出吗?

刚开始使用 TypeScript,我不想走错路。

【问题讨论】:

  • TypeScript 确实还不是真正的 ES6 超集,很多 ES6 特性(例如模块)在 TS 中还没有准备好。
  • @BenjaminGruenbaum 模块已在 TypeScript 中准备就绪(带有 ES6 目标),在 JavaScript VM 中尚未准备好。

标签: javascript typescript ecmascript-6


【解决方案1】:

为什么目标 ES3 和 ES5 不存在 Number.EPSILON

我认为 TypeScript(基本上)是带有附加类型注释的 ECMAScript 6(又名 2015)。

TypeScript 是带有附加注释的 ECMAScript。 ES6 的一些特性,如类、rest 参数、lambdas、for oflet,在 ES5 或 ES3 中有干净的等效代码,编译器可以为这些目标生成一些代码。但是新的 API 需要 polyfill,并且编译器不会添加任何运行时库(与 Babel 或 Traceur 不同)。

您的代码使用目标 ES6 编译。

对于目标 ES3 和 ES5,您必须:1/ 加载一个 polyfill (like this one) 并 2/ 添加 TypeScript 编译器的定义。

查找 ES6 API 的 TypeScript 定义

因此,您需要找到定义。这是查找 ES6 API 定义的提示。

所有 ES6 API 的定义都已经在编译器中定义了。我们可以使用它们。在您的节点目录中,打开文件lib/node_modules/typescript/lib/lib.es6.d.ts。然后,搜索EPSILON。你会发现一个接口NumberConstructor。下面是它的代码(TS 1.6.2):

interface NumberConstructor {
    /**
      * The value of Number.EPSILON is the difference between 1 and the smallest value greater than 1
      * that is representable as a Number value, which is approximately:
      * 2.2204460492503130808472633361816 x 10‍−‍16.
      */
    EPSILON: number;

    /**
      * Returns true if passed value is finite.
      * Unlike the global isFininte, Number.isFinite doesn't forcibly convert the parameter to a
      * number. Only finite values of the type number, result in true.
      * @param number A numeric value.
      */
    isFinite(number: number): boolean;

    /**
      * Returns true if the value passed is an integer, false otherwise.
      * @param number A numeric value.
      */
    isInteger(number: number): boolean;

    /**
      * Returns a Boolean value that indicates whether a value is the reserved value NaN (not a
      * number). Unlike the global isNaN(), Number.isNaN() doesn't forcefully convert the parameter
      * to a number. Only values of the type number, that are also NaN, result in true.
      * @param number A numeric value.
      */
    isNaN(number: number): boolean;

    /**
      * Returns true if the value passed is a safe integer.
      * @param number A numeric value.
      */
    isSafeInteger(number: number): boolean;

    /**
      * The value of the largest integer n such that n and n + 1 are both exactly representable as
      * a Number value.
      * The value of Number.MIN_SAFE_INTEGER is 9007199254740991 2^53 − 1.
      */
    MAX_SAFE_INTEGER: number;

    /**
      * The value of the smallest integer n such that n and n − 1 are both exactly representable as
      * a Number value.
      * The value of Number.MIN_SAFE_INTEGER is −9007199254740991 (−(2^53 − 1)).
      */
    MIN_SAFE_INTEGER: number;

    /**
      * Converts a string to a floating-point number.
      * @param string A string that contains a floating-point number.
      */
    parseFloat(string: string): number;

    /**
      * Converts A string to an integer.
      * @param s A string to convert into a number.
      * @param radix A value between 2 and 36 that specifies the base of the number in numString.
      * If this argument is not supplied, strings with a prefix of '0x' are considered hexadecimal.
      * All other strings are considered decimal.
      */
    parseInt(string: string, radix?: number): number;
}

只需将此代码添加到您的项目中即可。

【讨论】:

  • 我认为将界面复制到代码中并不是添加默认类型的正确方法。无论如何都不能包含默认类型吗?
  • @Manuel 是的,从 TS 2.0 开始就有可能。请参阅选项 --lib here。我会尽快修改我的答案。
【解决方案2】:

合法解决方案:

interface INumber {
    EPSILON: any
}
declare var Number: INumber;

【讨论】:

    猜你喜欢
    • 2012-06-12
    • 2015-12-19
    • 2016-09-06
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 2015-12-08
    相关资源
    最近更新 更多