添加类型缺少的方法(从一个NPM包)

添加类型缺少的方法(从一个NPM包)

问题描述:

我使用包@types/cropperjs 不幸的是,它落后于当前的cropper.js版本,缺少方法scale。 到目前为止,我只是手动添加缺少的方法将d.ts下node_modules文件(这显然是一个坏主意,所以不要做!这只是一个临时的。修复添加类型缺少的方法(从一个NPM包)

我试着将node_modules的定义与我自己的声明合并。

declare class cropperjs { 

    /** 
    * Scale the image. 
    * 
    * @param scaleX The scaling factor to apply on the abscissa of the image. 
    * When equal to 1 it does nothing. Default is 1 
    * @param scaleY The scaling factor to apply on the ordinate of the image. 
    * If not present, its default value is scaleX. 
    */ 
    scale(scaleX: number, scaleY?: number): void; 
} 

export = cropperjs; 
export as namespace Cropper; 

从DefinitlyTyped回购的分型可以found on github(它看起来类似,但太大了,这里显示)

以下是我在一个角度成分导入农作物。

import * as Cropper from 'cropperjs';

这里是我的tsconfig.json(它的一部分)

"typeRoots": [ 
    "node_modules/@types", 
    "node_modules/@angular", 
    "src/typings" 
], 
"types": [ 
    "jasmine", 
    "node", 
    "karma", 
    "webpack", 
    "cropperjs" 
] 

我和定制试了一下分型的文件夹与特里普尔斜线参考符号。 但我不明白如何我可以成功地合并我的和DefinitlyTyped的定义,所以我可以使用cropperjs,而不必在node_module四处乱动

P.S. 我已经在github上更新了定义(没有拉请求,因为当时几乎没有git的知识)已经打开了一个问题。

据我所知,你不能在打字稿中这样做。 Typescript具有声明合并的概念,这允许我们扩展其他人编写的类型,并且可以合并接口和命名空间,但不能合并类。看看here

如果使用接口编写@types/cropperjs,则可以使用自己的声明扩展该接口。

这里是一个丑陋的黑客攻击,你可以现在做的事:

import * as Cropper from 'cropperjs'; 

interface MyCropper extends Cropper { 
    scale(scaleX: number, scaleY?: number): void; 
} 

function CreateCropper(dom: HTMLImageElement, options: Cropper.CropperOptions): MyCropper { 
    return new Cropper(dom, options) as MyCropper; 
} 

铸造永远是丑陋,但至少你把它藏在一个地方,我认为这是合理的......

只是想增加另一个可能的“解决方案”。我说“解决方案”,因为它在我看来很难看,但它又是一个解决方法。

看到和阅读后(见阿维亚德哈达的回答)这个类合并是不可能的,了解typescripts node module resolution 基本上,如果你导入像import * as Cropper from 'cropperjs打字稿的非相对路径将寻找一个文件夹名为node_modules和它相应的文件从包含导入语句的文件所在的目录开始。然后,它横穿向上(从打字稿文档所采取的示例)

  • /root/src/node_modules/moduleB.ts
  • /root/node_modules/moduleB.ts
  • /node_modules/moduleB。TS(我认为这是全球node_modules目录)

由于输出文件也将寻找d.ts文件,我从@types/cropperjs包复制整个index.d.ts,它更名为cropperjs.d.ts,并把它命名/root/src/node_modules文件夹中。 (并添加了缺少的方法)

如果您使用tsc --traceResolution跟踪分辨率,则会看到打字稿将从node_modules目录中获取d.ts文件。

该解决方案的优点是您不必触摸代码。只要@types/cropperjs已更新缺少的方法,您可以删除您的自定义node_modules目录,一切仍将工作。 缺点是你必须复制和粘贴代码。