添加类型缺少的方法(从一个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目录,一切仍将工作。 缺点是你必须复制和粘贴代码。