2016-08-23 61 views
4

延长下划线我有下面的代码片段与求和函数,延长下划线如何使用打字稿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); } 
}); 

但是使用_。 总和()给我的“物权‘和’对类型不存在‘UnderscoreStatic’。

那么,谁能告诉我这样做的正确方法?

+0

我知道你要的底线,但lodash(这是下划线的超集)可以延伸,就像在[本概述答案](http://stackoverflow.com/questions/34660265/importing-lodash-into-angular2-typescript-application)。 – Tholle

回答

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强调必须至少运行一次,你必须包括/需要该修改的早期,但您可以使用下划线包正常后,这已被混合。

+0

我知道这已经很老了,但我实际上并没有能够得到这个工作。即使在这个答案中描述的全球增强声明之后,它仍然说我的新mixin不是UnderscoreStatic的一部分。 – dook

+0

Typescript一直在改变,所以他们可能改变了这一点。你可以尝试扩展并导入你的新扩展?看下一个答案。 – Lostfields

0

打字稿需要声明的定义,总和()不知道你有没有试图扩大下划线为一类,并声明和作为一个静态方法

然后出口的新的扩展下划线类在你的应用程序中使用

编辑;? 下划线没有一个构造函数,所以你必须ex往往接口和混入的更改并返回类似这样的新界面:

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

我实际上是在1.8中声明的“扩展全局/模块范围”来扩展下划线。我想我有一些误解here.pseudo代码非常感谢。 – sercan

+0

对不起,编辑我的职务并增加了一个可能的解决方案 – Lostfields

+0

的作品,但是这不正是我assumed.I奇迹,要确保如果不能导入只是强调本身,而不是扩展一个使用下划线的增强方法 – sercan