如何在node_modules中为js项目使用本地的Typescript定义文件?

时间:2017-08-13 01:51:23

标签: typescript typescript-typings

我从npm导入一个Javascript包,它在任何地方都没有Typescript定义文件。我想创建一个本地定义文件,我最终将PR定义为DefinitelyTyped或项目本身。

我无法确定在何处/如何创建和放置定义文件,以便在本地找到它。

我可以将它复制到node_modules/the-package目录中,但在其他安全的npm操作中它会被破坏。

从观察tsc --traceResolution开始,我没有看到一个很好的方法来做到这一点,除非有某种方法可以使用typestypings我没有#&# 39; t想。

2 个答案:

答案 0 :(得分:4)

我失败的一种方法是创建一个本地*.d.ts文件,就像@ Saravana的一行修改一样:

import {Component} from 'react'

declare module 'lodash' {

  interface Lodash {
      map: Function
  }

  var _: Lodash;
  export = _;
}

这引起了神秘的错误消息

Error:(3, 16) TS2665:Invalid module name in augmentation. Module 'lodash' resolves to an untyped module at 'my-project/node_modules/lodash/lodash.js', which cannot be augmented.

这个错误让我觉得这种做法一定是完全错误的,当它真的只是抱怨一个微不足道的,易于修复的错误时。当您在文件中import时,它会将文件转换为模块,当Typescript在模块中看到declare module时,它会假定您正在尝试增强现有定义。修复很简单:只需在declare块内移动导入,如下所示:

declare module 'lodash' {

  import {Component} from 'react'

  interface Lodash {
      map: Function
  }

  var _: Lodash;
  export = _;
}

如果您使用自动导入的IDE,它每次都会以这种方式破坏您的定义文件 - 请记住移动导入!

答案 1 :(得分:1)

您可以使用*.d.ts创建一个本地文件,并创建一个与您的库同名的模块。

例如,如果您使用的是lodash,则可以通过创建d.ts文件为其创建输入:

declare module "lodash" {

    interface Lodash {
        map: Function
    }

    var _: Lodash;
    export = _;
}

请参阅documentation on creating declarations