2016-07-23 99 views
1

我想知道为什么打字稿,出现以下错误抱怨压缩功能:打字稿误差与Lodash

(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[]

UPDATE

我错了。我改变了价值观的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有关嵌套数组的东西吗?

+0

那么显式指定联合类型为泛型参数呢? '_.zip <数字|字符串>(...)' –

+0

谢谢。让我尝试。 –

+0

不,仍然无法正常工作。我想你的意思是明确输入'_.zip'的预期输出。我认为这将是一个数组的数组。 –

回答

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); 

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

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); 
+0

谢谢。优秀的答案。我对在绝对定义类型中使用的类型感到困惑。有几个问题:在列表 []'的上下文中,“List”类型是什么?你如何阅读''? –

+1

@RobertSmith'<串|数[]>' - 字符串或数字的阵列,'<(字符串|号)[]>' - 字符串或数字的阵列的任一阵列。参见[联合类型](https://www.typescriptlang.org/docs/handbook/advanced-types.html) –

+1

'List'实际上是在lodash类型定义别处定义。它旨在比包含jQuery对象的数组稍微更通用。除了没有jQuery对象的通用类型之外,你可以把它看作是'',因此它们对它的定义有点不同(例如任何可以用'length'属性进行索引的东西)。 '...'是一种说法,[允许零个或多个参数](http://stackoverflow.com/questions/12697275/open-ended-function-arguments-with-typescript)。所以这个函数可以取1,2,3,或者你想要的任何项目,每个项目需要是一个'List '。 – Pace