網站搜尋

npm - Typescript 找不到本地鏈接的模組?


我正在嘗試測試一些我為一個沒有任何型別定義的 Node 專案所做的 TypeScript 定義。當我將它們包含在使用目標 Node 專案的專案中時,它們已經可以運作,或者當我在 node_modules/@types/ 中建立自己的資料夾並將它們放在那裡(node_modules/@types/chrome-aws-lambda/index.d.ts)時,也可以運作。這是在使用 Node 8.10、npm 5.6 以及 TypeScript 3.1 的情況下。

不過,我已經從 GitHub 分叉了這個模組的倉庫,並希望將它包含在專案中,以便其他人可以使用。為了實現這一點,我已經編輯了分叉專案的 package.json,將 types 指向與 main、source/index.js 文件並列的 source/index.d.ts。然後在我的專案中,我使用 npm link ../chrome-aws-lambda 將其連結起來。

這不行。當我執行 tsc 時,無法找到它所說的模組。error TS2307: Cannot find module 'chrome-aws-lambda' 當我使用 --traceResolution 執行時,它甚至看起來都沒有試著去尋找它。

我想過這可能與套件並未真正“安裝”有關,所以我試著直接把專案目錄複製到 node_modules,而不是使用連結。我也認為可能有些東西沒運作,TypeScript 並沒有讀取 package.json 中的 types 欄位,所以我在根目錄放了一個,因為那是預設值。我想可能它沒有被包含進去,所以我在 .tsconfig 的 include 部分加上了它。我也嘗試過修改設定檔中的 baseUrl、paths、typeRoots 及 moduleResolution。

這些都不起作用。

我不想提交一個 PR,而不知道它是否能正常運作。有誰對這裡該怎麼做有任何線索嗎?我很樂意提供任何需要的相關資訊,請告訴我!我已經附上了 index.d.ts 以及下面的 import 語句,以防我只是在哪裡做錯了什麼。

謝謝!

index.d.ts:

declare module 'chrome-aws-lambda' {
    import * as Puppeteer from 'puppeteer';

    export default class Chromium {
        static args : Array<string>;
        static defaultViewport : {
            width : number,
            height : number,
            deviceScaleFactor : number,
            isMobile : boolean,
            hasTouch : boolean,
            isLandscape : boolean
        };
        static executablePath : Promise<string>;
        static headless : boolean;
        static puppeteer : typeof Puppeteer;
    }
}

以及相關的匯入語句:

import Chromium from 'chrome-aws-lambda';

答案#1

根據這個回答,你必須將你的 .d.ts 文件設置為一個模組。希望這對你有幫助。

另外,你不必把 .d.ts 放到特定路徑,它可以放在專案的任何地方。我認為這個討論會非常有幫助。