Lodash

时间:2016-07-23 20:45:39

标签: typescript lodash

我想知道为什么Typescript会抱怨以下错误:

(22,28): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
  Type argument candidate 'string' is not a valid type argument because it is not a supertype of candidate 'number[]'.

当我使用带有以下参数的zip函数时:

let ranges = ["0-100", "100-200", "200-300", "300-400", "400-500"];
let arrays = [[19.99, 49.99, 49.99, 49.99, 29.99, 29.99, 9.99, 29.99, 34.99, 34.99, 59.99], [149.99, 179.99, 129.99, 149.99, 129.99, 199.99, 129.99], [209.99, 249.99, 292.99, 279.99, 219.99]];

let result = _.zip(ranges, arrays);

但是,如果我使用_.zipObject,则错误消失。

如果重要,我使用typings install lodash --save安装了类型信息。

更新2

我认为zip不喜欢接收不同类型的参数。在这种情况下,ranges类型为string[]arrays类型为number[]

更新

我错了。我更改了arrays的值以使用字符串,但现在我得到了这个稍微不同的错误:

(24,28): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
  Type argument candidate 'string' is not a valid type argument because it is not a supertype of candidate 'string[]'.

可能在变量arrays中存在与嵌套数组相关的内容?

2 个答案:

答案 0 :(得分:4)

你是对的zip不喜欢不同类型的参数。如此处所定义......

zip<T>(...arrays: List<T>[]): T[][];

这基本上意味着所有参数必须是相同类型的数组。但是,当您将数组更改为字符串时,我怀疑您有类似......

的内容
let ranges = ["0-100", "100-200", "200-300", "300-400", "400-500"];
let arrays = [["19.99", "49.99",...], ["149.99", ...], ...];

这些仍然不是同一类型。 ranges是一维字符串数组(string数组),数组是字符串的二维数组(string[]数组)。一组有效的输入就像......

let ranges = ["0-100", "100-200"];
let arrays = ["19.99", "49.99"];

这两种类型都是字符串数组。但是,我怀疑这不是你想要的。您想要的输出是否如下所示?

[["0-100", ["19.99", ...]], ["100-200", ["149.99", ...]], ...]

如果是这样,那么你可以简单地做......

_.zip<any>(ranges, arrays);

这告诉打字稿迫使T成为any所以函数定义变为......

zip(...arrays: List<any>[]): any[][];

示例:

let ranges = ["0-100", "101-200"];
let arrays = [[0, 1, 2], [3, 4, 5]];
_.zip<any>(ranges, arrays);
//[ [ '0-100', [ 0, 1, 2 ] ], [ '101-200', [ 3, 4, 5 ] ] ]

更新:正如评论中所提到的,你也可以......

_.zip<string|number[]>(ranges, arrays);

答案 1 :(得分:0)

现在有一种_.zip的形式,它允许您将数组中包含的类型指定为类型参数。

zip<T1, T2>(arrays1: List<T1>, arrays2: List<T2>): Array<[T1 | undefined, T2 | undefined]>;

这样您就可以写

_.zip<string, number[]>(ranges, arrays);

这将返回Array<[string | undefined, number[] | undefined]>,并使您避免使用any(这违背了使用TypeScript的目的)