【问题标题】:How do you use Twix (momentjs) with Typescript你如何在 Typescript 中使用 Twix (momentjs)
【发布时间】:2016-10-02 02:13:07
【问题描述】:

有没有人将 twix 与 typescript 一起使用并可以分享你是如何工作的?

我有:

import * as moment from 'moment';
import * as twix from 'twix';

Moment 工作正常,智能感知和一切。 Twix 模块导入正常,如果我输入 twix.我可以看到弹出的界面。

但我明白了:

Moment 上不存在属性 twix

当我尝试使用moment(date).twix()

编辑: 我也试过let twix = require('twix');import twix = require('twix'); 没有成功。

编辑 2 我跑了npm install momentnpm install twixnpm install @types/twix

我知道 moment 已安装并且可以正常工作。 moment 使用的类型文件是 moment npm 包中包含的 moment.d.ts 文件。

用于 twix 的类型文件位于 @types/twix npm 包中。

导入后,如果我输入 let t = twix.,则智能感知会弹出 Twix、TwixFormatOptions、TwixIter、TwixParseAndFormatOptions 等,所以我认为 typescript 正在识别 twix 类型。

最终修复

github issue 解释了扩展 momentjs 的包的类型被破坏的根本原因,并引用了合并后将永久修复它的拉取请求。

【问题讨论】:

    标签: typescript momentjs


    【解决方案1】:

    尝试替换:

    import * as twix from 'twix';
    

    与:

    let twix = require('twix');
    

    据我了解,Twix 是作为 CommonJS 模块而不是 ES6 模块编写的,因此导入方法不同。

    更多关于差异的信息here

    编辑: twix 的 2.0 输入似乎有问题。一种解决方法是从 github 获取 2.0 之前的 twix 类型的副本并将其添加到您的项目中。

    【讨论】:

    • Typescript 编译器不接受 let twix = require('twix');,但它接受 import twix = require('twix');,如在 typescript docs 上找到的那样。但即便如此,问题仍然存在......时刻对象上仍然不存在 twix 方法。
    • 是的,这不起作用 let 是一个替换 var 的 ES6 关键字。尝试改用var twix = require('twix');
    • 好的,这很奇怪。您是否同时安装了 Twix 库和 Moment?
    • 哦,我明白了,看起来 2.0 打字不适合与 moment 一起打字的那一刻。我通过将 twix 文件夹和 moment 文件夹从 DT master branch 复制到我的项目中来让它工作
    • 是的!我刚刚用 DT twix 类型替换了@types/twix/index.d.ts,将该文件中的引用更改为指向 node_modules/moment/moment.d.ts,在那里我直接从 DT 复制了时刻类型。它有效!现在我只需要找出最好的方法来做到这一点,这样它就不会在我npm install 一切并丢失自定义项时中断。如何将您的评论标记为答案?谢谢
    【解决方案2】:

    Moment 上不存在属性 twix

    您需要为twix 创建当前不存在的类型定义。

    修补程序

    你可以断言any,这就像你在写未经检查的javascript:

    (moment(date) as any).twix()
    

    关于断言的更多信息:https://basarat.gitbooks.io/typescript/content/docs/types/type-assertion.html

    正确修复

    您需要创建一个扩充 momentjs 定义的定义。这是一项工作,建议阅读 typescript 规范。

    【讨论】:

    • 我确实从 npm @types/twix 加载了类型定义。在该定义中,它确实声明了“moment”模块和 Moment 接口,并向其中添加了 twix() 函数。根据我的理解阅读this documentation 那么这两个声明的模块/接口应该合并只是因为它们命名相同?
    【解决方案3】:

    使用 Angular4 和 angular-cli,这种情况发生了变化。你现在可以这样做了:

    var moment = require('moment');
    require('twix');
    

    import * as moment from 'moment';
    require('twix');
    

    那么当你编写代码时,你就可以正常编写了,如下所示:

        public t = moment('2016-12-30T09:30').twix(moment()).count('weeks');
    

    【讨论】:

      【解决方案4】:

      您需要做的就是安装@types/twix npm 模块。

      npm install --save @types/twix
      

      import * as moment from 'moment';
      require('twix');
      

      【讨论】:

        猜你喜欢
        • 2013-04-07
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 1970-01-01
        • 1970-01-01
        • 2017-07-19
        • 2020-08-05
        • 2018-11-08
        相关资源
        最近更新 更多