12

IdentifyTypedは、インターフェイスを定義するアンダースコア宣言ファイルを提供し、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

5 に答える 5

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;
});
于 2013-01-29T14:37:35.263 に答える
0

アンダースコア TypeScript 定義ファイルが、使用しているアンダースコアのバージョンと一致することを確認します。countBy の署名が変更され、TS 定義が基礎となる JS と一致しない場合、予期しない動作が発生します。

于 2016-02-18T11:04:29.087 に答える
0

最初にアンダースコアの入力を追加します。

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

次に、このファイルを .ts ソースで参照します

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

次に、コンパイル エラーを回避するためにアンダースコアをインポートします (注意してください。この場合、アンダースコア lib は、bower ではなく npm リファレンスとしてインストールする必要があります: npm install underscore --save ) 。

import _ = require('underscore');

次に、 「_」グローバル変数を使用して、通常どおりアンダースコアを使用します

_.isNumber(123);
于 2016-10-12T15:28:32.290 に答える