如何使用DefinitelyTyped的下划线lib与typescript?

时间:2013-01-29 14:33:23

标签: typescript definitelytyped

DefinitelyTyped提供了一个下划线声明文件,该文件定义了List接口,并在代码中大量使用它。

// Common interface between Arrays and jQuery objects
interface List {
    [index: number]: any;
    length: number;
}

interface UnderscoreStatic {
    sortBy(list: List, iterator?: any, context?: any): any;
    groupBy(list: List, iterator: any): any;
    countBy(list: List, iterator: any): any;
}

我正在尝试使用countBy函数:

// <reference path="../DefinitelyTyped/underscore/underscore.d.ts" />

declare var _: UnderscoreStatic;

_.countBy([1,2,3], function(item) {
    return item%2;
});

编译文件时,会抛出错误:

> tsc commons.ts

> E:/commons.ts(5,0): Supplied parameters do not match any signature of call target:
    Could not apply type 'List' to argument 1, which is of type 'number[]'

我不知道为什么会发生此错误,因为number[]符合界面List

哪里出错,以及如何解决?

4 个答案:

答案 0 :(得分:6)

您需要传递与List接口兼容的对象,该接口是一个长度为的数组:

/// <reference path="underscore.d.ts" />

var list: List;
list[0] = 1;
list[1] = 2;
list[2] = 3;
list.length = 3;

_.countBy(list, function (item) {
    return item % 2;
});

老实说,数组技术上满足了它,因为它有一个长度属性 - 但上面的代码编译。

这个简写版有点讨厌:

/// <reference path="underscore.d.ts" />

var list = <List><any> [1, 2, 3];

_.countBy(list, function (item) {
    return item % 2;
});

答案 1 :(得分:0)

检查下划线TypeScript定义文件是否与您正在使用的下划线版本匹配。 countBy的签名已经改变,如果TS定义与底层JS没有匹配,你会得到一些意想不到的行为。

答案 2 :(得分:0)

首先添加下划线输入:

npm install typings --global
typings install dt~jasmine --save --global

然后在您的.ts源

中引用此文件
/// <reference path="../../../typings/underscore.d.ts" />

然后导入下划线以避免编译错误(小心 - 在这种情况下,下划线lib应安装为npm参考,而不是bower: npm install underscore --save

import _ = require('underscore');

然后使用&#34; _&#34; 全局变量

照常使用下划线
_.isNumber(123);

答案 3 :(得分:0)

使用Typescript 2.0,您可以使用import语句导入下划线,如下所示:

import * as _ from "underscore";

然后,使用_.<function_name>调用任何下划线函数。

PS:不要忘记用npm安装下划线库。