代码之家  ›  专栏  ›  技术社区  ›  phil294

导入已发布index.d.ts的包

  •  0
  • phil294  · 技术社区  · 6 年前

    例如,

    yarn add http-status-codes
    

    如果我从那个包中导入某些内容,如

    import { BAD_GATEWAY } from 'http-status-codes';
    

    typescript抱怨“找不到模块http状态代码”。 但是 http状态代码已经发布了自己的 index.d.ts 类型定义文件。

    出于某种原因,这种行为 仅可与“target”一起复制:“es6”或更高版本 (没有问题 "es5" 出于某种原因)。

    为什么我不能使用可用的键入文件?这不是现代软件包的工作方式吗? 需要额外的 yarn add @types/http-status-codes 是吗?(反正也不存在)。要从包含其类型定义的包中导入,必须执行哪些操作?为什么这不是默认值?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Titian Cernicova-Dragomir    6 年前

    如果您指定 es6 模块系统将默认为该版本ES的本机模块系统(即 ES2015 模块系统)。从 documentation 以下内容:

    有两种可能的模块解析策略:node和classic。可以使用--moduleResolution标志指定模块解析策略。如果未指定,则默认值是经典的--module amd system es2015或node-otherwise。

    您可以阅读文档以获取更多信息,但是 clasic 解决策略不使用 node_modules 找到定义,而 node 模拟节点查找模块的方式(查找 节点模块 对于定义)。

    你需要添加到 tsconfig.json 这个 moduleResolution 选项:

    {
        "compilerOptions": {
            "moduleResolution": "node",
            "target": "es6",
        }
    }
    

    这适用于 es5 因为为了 ES5标准 模块系统默认为 "CommonJS" ( see docs )默认情况下使用节点分辨率。