如何使用 Typescript 2.0 扩展下划线

How to extend underscore using Typescript 2.0

我有以下代码片段来使用求和函数扩展下划线

//underscore.extension.ts    
import * as _ from "underscore"

declare module "underscore" {
    export interface UnderscoreStatic {
        sum(items: number[]): number;
    }
}

_.mixin({
    sum: items => { return _.reduce<number, number>(items, function (s, x) { return s + x; }, 0); }
});

但是,使用 _.sum() 给我“ 属性 'sum' 在类型 'UnderscoreStatic' 上不存在。

好吧,谁能告诉我正确的做法?

typescript 需要声明的定义,而 sum() 未知。您是否尝试过将下划线扩展为 class 并将 sum 声明为静态方法?

然后导出新的扩展下划线 class 以用于您的应用程序?

编辑; Underscore 没有构造函数,因此您必须扩展接口并混合您的更改和 return 新接口,如下所示:

import * as _ from 'underscore';

interface UnderscoreExtended extends UnderscoreStatic {
    sum(items: number[]): number;
}

_.mixin({
    sum: items => { return _.reduce<number, number>(items, function (s, x) { return s + x; }, 0); }
});

export { UnderscoreExtended } // as UnderscoreStatic }

export default _ as UnderscoreExtended;

在您的项目中,您可以导入此扩展下划线并正常使用它

import _ from '<your file containing extended underscore>';

_.isNumber(
    _.sum([1, 2])
);

在进一步查找之后,您还可以使用全局增强来解决您的问题 (https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation)

import * as _ from "underscore"

declare global {
    interface UnderscoreStatic {
        sum(items: number[]): number;
    }
}

_.mixin({
    sum: items => { return _.reduce<number, number>(items, function (s, x) {     return s + x; }, 0); }
});

因为你的 underscore 混入必须至少 运行 一次,所以你必须尽早 include/require 这个修改,但是你可以在混入后正常使用 underscore 包。