Как использовать underscore lib от DefinitelyTyped с помощью typescript?
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
.
Где не так, и как его исправить?
Ответы
Ответ 1
Вам необходимо передать объект, совместимый с интерфейсом 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;
});
Всем честно, массив технически выполняет это, поскольку он имеет свойство length, но код кода компилируется.
Сокращенная версия этого немного неприятная:
/// <reference path="underscore.d.ts" />
var list = <List><any> [1, 2, 3];
_.countBy(list, function (item) {
return item % 2;
});
Ответ 2
Убедитесь, что файл определения подчеркивания TypeScript соответствует версии подчеркивания, которую вы используете. Подпись countBy изменилась, и если определение TS не соответствует базовому JS, вы получите какое-то неожиданное поведение.
Ответ 3
Сначала добавьте текст подчёркивания:
npm install typings --global
typings install dt~jasmine --save --global
Затем укажите этот файл в источнике .ts
/// <reference path="../../../typings/underscore.d.ts" />
Затем импортируйте символ подчеркивания, чтобы избежать ошибок компиляции (будьте осторожны - underscore lib в этом случае должен быть установлен как ссылка на npm, а не bower: npm install underscore --save)
import _ = require('underscore');
Затем используйте знак подчеркивания, как обычно, используя глобальную переменную "_"
_.isNumber(123);
Ответ 4
Используя Typescript 2.0, вы можете импортировать подчеркивание с помощью инструкции import
, как показано ниже:
import * as _ from "underscore";
Затем вызовите любую функцию подчеркивания с помощью _.<function_name>
.
PS: не забудьте установить библиотеку подчеркивания с номером npm, например.