16

我有一些代码将对象转换为数组类型(因此我可以在对象上使用数组函数而不会出现编译错误)。

    var n = (result.data['value'] as []).map( (a)=>{
      //..
    });

但是在升级到 ts2 时,我得到:

错误 TS1122:元组类型元素列表不能为空。

这实际上是一个语法错误,声称您忘记了逗号或值。那么,如何修改此演员表以使其正常工作?

我试过as [IMyType]了,它奏效了,但我不想指定类型,因为我只需要array.prototype这里的函数......而且,我不认为你实际上是这样做的。

4

3 回答 3

31

出于某种原因,编译器认为这result.data['value'] 是一个元组而不是一个数组。

你可以像这样投射它:

result.data['value'] as any[]

这应该告诉编译器它是一个数组,或者:

result.data['value'] as Array<any>

如果您的数组只有类型的项目,IMyType那么只需:

result.data['value'] as IMyType[]

但是,如果您的数组包含不同类型的项目,那么它要么是一个元组,要么是any[]一个元组,例如:

result.data['value'] as [IMyType, string, string]

无论如何,在编译后的 js 中它将是一个数组,但元组允许您定义具有特定类型的固定长度数组。

于 2016-09-22T22:58:20.093 回答
9

您没有投射到数组中。

[string]是具有单个元素的元组string

[string, string]是一个有两个元素的元组,string并且string.

[]是一个元素为零的元组。

字符串数组的语法是string[]

您可能想要的是result.data['value'] as any[].

于 2016-09-22T23:09:27.560 回答
1

除了上面提到的前面的转换语法选项,您还可以执行以下操作:

var n = (<SampleType[]>result.data['value']).map((a) => {
    //..
});
于 2017-03-08T11:16:16.313 回答