【问题标题】:TypeScript | Array.from | error TS2339: Property 'from' does not exist on type 'ArrayConstructor'打字稿 |数组.from |错误 TS2339:“ArrayConstructor”类型上不存在属性“from”
【发布时间】:2016-08-11 08:27:08
【问题描述】:

我在谷歌上搜索,但找不到信息应该添加什么以及如何添加到我的项目中以允许我使用像 Array.from 这样的 ES6 方法

__ 编辑:删除原型词

【问题讨论】:

  • 'Array.from' 在大多数浏览器中都受支持,但您可以找到polyfill in MDN
  • 问题是如何将它添加到 TypeScript 定义中...我不需要 polyfill,我使用 Babel 和 TypeScript 将我的 ES6 代码转换为 ES5。只是 TypeScript 没有定义,对于最新的方法......

标签: typescript ecmascript-6


【解决方案1】:

如果您确定该 API 在运行时存在于您的引擎中,请使用 --lib es6(如果您使用 DOM API,则使用 --lib dom,es6)进行编译。

更多详情请见Compiler Options documentation

【讨论】:

  • 请去掉空格,使它像这样'--lib dom,es6'。
【解决方案2】:

您可以像这样轻松扩展现有类型:

interface Array {
    from(arrayLike: any, mapFn?, thisArg?): Array<any>;
}

这里的问题是,这会将函数添加到数组实例中,而不是像您需要的那样作为静态函数。
但可以这样做:

interface ArrayConstructor {
    from(arrayLike: any, mapFn?, thisArg?): Array<any>;
}

那么你应该可以使用Array.from

Playground 上试用。


编辑

如果您需要 polyfill 实现(因为您打算运行的环境没有它),那么方法如下:

interface ArrayConstructor {
    from(arrayLike: any, mapFn?, thisArg?): Array<any>;
}

Array.from = function(arrayLike: any, mapFn?, thisArg?): Array<any> {
    // place code from MDN here
}

The polyfill code in MDN.


第二次编辑

根据评论,我正在添加一个打字版本:

interface ArrayConstructor {
    from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): Array<U>;
    from<T>(arrayLike: ArrayLike<T>): Array<T>;
}

它与lib.es6.d.ts 中的定义完全相同。

【讨论】:

  • 这是否意味着没有“标准”方式将 ES6 方法定义添加到 TS 中?我试图在这里找到它:definitelytyped.org/tsd 但没有任何运气......这是由 MS 制造的下一个“伟大”的东西吗?
  • @Kania 它有什么不标准的?该语言使您能够在需要时添加方法,您还能要求什么?
  • ES6 不是私有项目。为什么要手动添加由 ES6 方法定义的?也许我对 MS 的期望太高了。
  • 有很多东西是人们希望添加到 typescript 中的,而且随着时间的推移,事情已经完成了,但你不能指望它拥有一切。但是因为你可以很容易地自己添加,也许不是他们的首要任务
  • @SandyGifford 我的错,我忘了为它复制另一个签名(不包括映射)。我修正了我的答案。
【解决方案3】:

我希望这不是太离题,但我在将 js 重构为 ts 时发现了这一点,如果你有一个类似的数组,它似乎可以简单地将数组传递给构造函数而不是使用 from,从而消除了对额外的方法。

例如

// someScript.js

Array.from( arrayLikeThing );

变成

// someScript.ts

Array( arrayLikeThing );

如果还有其他原因需要继续使用 .from,那么上述答案非常棒。

【讨论】:

  • 作为一个警告,刚刚发现它不能编译为array.from,所以最好像上面那样重新实现
  • Array.from(Array(3)).map(v =&gt; 1) // [1, 1, 1]
  • Array(Array(3)).map(v =&gt; 1) // [1]
【解决方案4】:

在为我解决的 compilerOptions 中添加以下行到 tsconfig.json。

“lib”:[“DOM”、“ES2015.Core”、“DOM.Iterable”、“ES2015.Collection”、“ES2015.Iterable”、“ES2015”]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2018-03-15
    • 2020-12-18
    • 2018-08-02
    • 2017-03-26
    • 2020-11-10
    • 2021-01-05
    相关资源
    最近更新 更多