【问题标题】:How to use the new @types packages for TypeScript typings?如何使用新的 @types 包进行 TypeScript 类型化?
【发布时间】:2017-05-19 01:15:48
【问题描述】:

我已经开始迁移基于 namespace<reference> 的大型现有 TypeScript 应用程序以使用 modules@types NPM 存储库。但是,我每时每刻都在遇到问题。

  1. 很多图书馆甚至没有打字。
  2. 许多图书馆的分型已经完全过时了。
  3. 很多库都有一个global 分型文件,导致我不能import 它,因为 TS 抱怨它不是一个模块。
  4. 当一个库有一个module 形状的类型文件正确包含在它的NPM 包中(如moment.js)时,TS 似乎仍然无法找到它,并且错误import * as moment from 'moment' 表示找不到模块。

这项技术的现状如何?乍一看,它似乎远未准备好生产。

有什么技巧可以解决这些问题?

我的目标是 es5 并使用 es6 作为 modules 配置。这可能是问题吗?据我所知,TS 也支持 es5 输出的 es6 模块语法。

【问题讨论】:

    标签: typescript typescript-typings typescript2.0 definitelytyped


    【解决方案1】:

    目前的工作方式绝对是生产就绪的;但是,有些事情并不明显,这不是你的错。

    让我试着一一回答你的问题。

    1. 很多图书馆甚至没有打字。

    在 TypeScript 2.1 中,只要你在 node_modules 中安装了一个包并且你没有打开 noImplicitAny,你就可以导入任何你想要的东西。

    如果您确实想使用noImplicitAny(我会建议您希望随着时间的推移而增长的任何项目),您可以随时在项目源文件夹中创建一个declarations.d.ts,根据需要声明模块:

    // do anything you want when you import `"foo"` now.
    declare module "foo";
    
    // can only access the `hello` export when importing `"bar"`.
    declare module "bar" {
        export var hello;
    }
    
    1. 许多图书馆的分型已经完全过时了。

    您绝对应该随意向 DefinitiveTyped 发送拉取请求,但如果您真的时间紧迫,您可以使用我为第 (1) 点提供的方法。

    1. 很多库都有一个global 类型文件,导致我不能import 它,因为 TS 抱怨它不是一个模块。

    如果您需要使用来自definitelyTyped 的全局声明文件,并且它没有自动包含在您的项目中,您可能需要将它添加到tsconfig.jsontypes 字段中。 请参阅我的另一个答案here,但关键是如果您需要包含foobar 包的全局声明,并且您安装了@types/foo@types/bar,您可以编写以下内容在你的tsconfig.json

    {
        "compilerOptions": {
            "types": ["foo", "bar"]
        }
    }
    
    1. 当库的 NPM 包中正确包含 module 形状的类型文件时(如 moment.js),TS 似乎仍然无法找到它,并且错误行 import * as moment from 'moment' 说找不到模块。

    我认为这与您针对 ES6 的事实有关。尝试将您的"moduleResolution" 选项更改为"node" 在您的tsconfig.json

    {
        "compilerOptions": {
            "moduleResolution": "node"
        }
    }
    

    抱歉,这是一个问题。 理由是,唯一真正具有这种解析语义的模块加载系统是 CommonJS(Node 使用的策略)。 我同意这可以改进。

    【讨论】:

    • 感谢您的详细解答,非常感谢。明天我会再看看我目前的所有混乱情况并提供一些反馈。
    • 再次感谢您,我会接受您的回答,因为它在技术上回答了我的问题并给了我一些很好的提示。但是,我遇到了一个后续问题,如果您有几分钟的时间,请在此处查看。 stackoverflow.com/questions/41474704/…
    猜你喜欢
    • 2016-12-29
    • 2016-09-29
    • 2018-07-11
    • 2019-10-06
    • 2018-10-15
    • 2023-02-17
    • 2017-02-10
    • 2022-11-27
    • 2019-03-02
    相关资源
    最近更新 更多