我正在尝试测试为没有任何内容的节点项目所做的一些 typescript 定义。当我将它们包含在消耗目标节点项目的项目中时,或者当我在node_modules/@types/中创建自己的文件夹并将其放在那里(node_modules/@types/chrome-aws-lambda/index.d.ts)时,它们已经起作用。这正在使用节点8.10,npm 5.6和 typescript 3.1

但是,我从github fork 了该模​​块的存储库,并希望将其包含在项目中,以便其他人可以使用它。为了做到这一点,我编辑了 fork 项目的package.json,将types指向位于source/index.d.tsmain文件旁边的source/index.js。然后在我的项目中,我使用npm link ../chrome-aws-lambda将其链接。

这是行不通的。当我运行tsc时,找不到它说的模块。error TS2307: Cannot find module 'chrome-aws-lambda'当我使用--traceResolution运行它时,它似乎并没有尝试寻找它。

我发现它可能与未真正“安装”软件包有关,因此我尝试将项目目录复制到node_modules而不是链接它。我还认为也许有些东西无法正常工作,并且 typescript 没有读取types中的package.json字段,所以我将一个放在根目录中,因为这是默认设置。我以为可能没有包含它,所以我在.tsconfig的include部分中添加了它。我也尝试在配置文件中更改baseUrlpathstypeRootsmoduleResolution

这些都不起作用。

我不想提交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';

最佳答案

根据this answer,您必须将.d.ts文件设为模块。希望它会有所帮助。

另外,您不必将.d.ts放在特殊路径中,它可以在项目中的任何位置。我认为这个discussion 将非常有帮助。

关于typescript - Typescript找不到本地链接的模块?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53489740/

10-16 13:02