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
。
哪里出错,以及如何解决?
答案 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安装下划线库。