2017-06-07 34 views
1

我使用包@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的知識)已經打開了一個問題。

回答

0

據我所知,你不能在打字稿中這樣做。 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; 
} 

鑄造永遠是醜陋,但至少你把它藏在一個地方,我認爲這是合理的......

0

只是想增加另一個可能的「解決方案」。我說「解決方案」,因爲它在我看來很難看,但它又是一個解決方法。

看到和閱讀後(見阿維亞德哈達的回答)這個類合併是不可能的,瞭解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目錄,一切仍將工作。 缺點是你必須複製和粘貼代碼。