Ramda 和 Typescript:添加缺少的类型

use*_*686 3 typescript ramda.js

我在当前项目中使用 TypeScript 和 Ramdajs。而且我刚刚意识到遗漏了一些打字,即没有打字innerJoin功能(@types/ramda 版本是 0.25.36,我现在的最新版本)。我尝试在项目中的单独文件中添加自定义定义:

declare namespace R {
    interface Static {
        innerJoin(): any;
    }
}
Run Code Online (Sandbox Code Playgroud)

乃至:

declare let R: R.Static;

declare namespace R {
    interface Static {
        innerJoin(): any; /* here should be a specific signature */
    }
}

export = R;
export as namespace R;
Run Code Online (Sandbox Code Playgroud)

但没有成功 - 打字稿标记R.innerJoin(/*...*/)为未知:

“静态”类型上不存在属性“innerJoin”

有人知道如何正确实施吗?我找到了一个解决方法:const R_innerJoin = (R as any).innerJoin 但我怀疑应该有使用 '.d.ts' 的更优雅的解决方案......

如果这很重要,PS ramda 版本是 0.25.0。

更新

我正在以这种方式使用 Ramda:

import * as R from 'ramda';
const myFn = (a, b) => R.innerJoin(// etc
Run Code Online (Sandbox Code Playgroud)

Mat*_*hen 5

由于您是R从模块导入命名空间,因此您必须扩充原始模块。如果您声明自己的R命名空间,最多只能看到您的命名空间或导入的命名空间,而不是合并。经过一些试验和错误后,以下内容对我有用:

declare module "dummy" {
    module "ramda" {
        interface Static {
            innerJoin(): any;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

需要外部模块声明来使内部模块声明成为“扩充”,而不是像本线程中提到的那样遮蔽原始模块。不幸的是,AFAIK 没有正确记录该技巧。