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

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

问题描述:

我从进口NPM一个JavaScript包,没有一个打字稿定义文件的任何地方。我想创建一个本地定义文件,我最终将PR保存到DefinitelyTyped或项目本身。如何在node_modules中为js项目使用本地Typescript定义文件?

我想不出哪里/如何创建和放置定义文件,使得其将在当地找到。

我可以把它复制到node_modules/the-package目录,但它会在安全的,否则NPM操作得到重挫。

通过观察tsc --traceResolution,我没有看到一个很好的办法做到这一点,除非有某种方式使用typestypings,我没有想通。

您只需创建*.d.ts本地文件,并且创建一个模块具有相同名称为您的图书馆。

例如,如果您正在使用lodash,你可以通过创建一个d.ts文件为它创建分型:

declare module "lodash" { 

    interface Lodash { 
     map: Function 
    } 

    var _: Lodash; 
    export = _; 
} 

documentation on creating declarations

+0

如何/你在哪里声明的定义文件?你能用一个可重复的例子更新你的问题吗? – Saravana

一个我在这个失败的方法是创建一个本地*.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,它每次都会打破你的定义文件以这种方式 - 记住移动进口!