如何使用Typescript 2.0扩展下划线

时间:2016-08-23 07:50:56

标签: typescript underscore.js mixins

我有以下片段用sum函数扩展下划线

//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 ()会给我&#34;财产&#39;总和&#39;类型&#39; UnderscoreStatic&#39;中不存在。

嗯,有人告诉我这样做的正确方法吗?

2 个答案:

答案 0 :(得分:0)

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

然后导出您的新扩展下划线类以在您的应用程序周围使用?

EDIT; Underscore没有构造函数,所以你必须扩展接口并混合你的更改并返回这样的新界面:

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])
);

答案 1 :(得分:0)

在查看了这一点之后,您还可以通过全局扩充来解决您的问题(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); }
});

由于你的mixin到下划线必须至少运行一次,你必须尽早包含/要求这个修改,但是你可以在混合后使用下划线包。