【问题标题】:How to extend underscore using Typescript 2.0如何使用 Typescript 2.0 扩展下划线
【发布时间】:2016-08-23 07:50:55
【问题描述】:

我有以下 sn-p 用 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() 会给我“属性 'sum' 在类型 'UnderscoreStatic' 上不存在。

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

【问题讨论】:

  • 我知道您要求输入下划线,但 lodash(它是下划线的超集)可以像 this answer 中所述进行扩展。

标签: typescript underscore.js mixins


【解决方案1】:

在进一步查找后,您还可以使用全局增强来解决您的问题 (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 不是 UnderscoreStatic 的一部分。
  • Typescript 一直在变化,所以他们可能已经改变了这一点。您可以尝试扩展并导入您的新扩展吗?看下一个答案。
【解决方案2】:

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

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

编辑; 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.8 中声明的“Augmenting global/module scope from modules”来扩展下划线。我想我在这里有一些误解。非常感谢伪代码。
  • 这行得通,但这并不完全是我的假设。我想知道并想确保它是否不能只导入下划线本身而不是扩展一个以使用下划线的增强方法
  • 当时我想到的唯一方法是修改您在项目中包含的声明文件 (d.ts) 的下划线。
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
相关资源
最近更新 更多