繁体   English   中英

为缺少的方法添加类型(来自 npm 包)

[英]add typings for missing method (from a npm package)

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

我试图将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;

可以在 github上找到 DefinitlyTyped Repo 中的类型(看起来很相似,但太大,无法在此处显示)

这是我在角度组件中导入裁剪器的方法。

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 中摆弄

PS 我已经在 github 上提出了更新定义的问题(没有拉取请求,因为当时几乎不了解 git)。

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

如果@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;
}

选角总是丑陋的,但至少你把它藏在一个地方,我认为它是合理的......

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

在查看和阅读(请参阅 Aviad Hadad 的答案)后,类合并是不可能的,并阅读有关typescripts 节点模块解析的信息 基本上,如果您导入非相对路径,如import * as Cropper from 'cropperjs将在文件夹中查找适当的文件命名为node_modules ,它从带有 import 语句的文件所在的目录开始。 然后它向上遍历(来自打字稿文档的示例)

  • /root/src/node_modules/moduleB.ts
  • /root/node_modules/moduleB.ts
  • /node_modules/moduleB.ts (我假设这是全局 node_modules 目录)

由于 typescript 还会查找d.ts文件,我从@types/cropperjs包中复制了整个index.d.ts ,将其重命名为cropperjs.d.ts并将其放在名为/root/src/node_modules的文件夹中。 (并添加了缺失的方法)

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

此解决方案的优点是您不必接触您的代码。 只要@types/cropperjs更新了缺少的方法,您就可以删除您的自定义 node_modules 目录,一切仍然有效。 缺点是您必须复制和粘贴代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM