类型“ any”的参数不能分配给类型“ never”的参数。

时间:2019-06-25 00:17:51

标签: typescript

我收到警告Argument of type 'any' is not assignable to parameter of type 'never'.ts(2345) Object is of type 'unknown'.ts(2571)

这是我的请求正文:

{"A":[{"filter":[{"a":"a"}]},{"group":[{"a":"a"}]}],"B":[{"filter":[{"a":"a"}]},{"group":[{"a":"a"}]}], ...}

这是我的脚本:

var a = Object.entries(body).reduce((acc, [key, value]) => {                                                                    
 acc.filter.push(...value[0].filter);                                                                    
 acc.group.push(...value[1].group);
 return acc;
}, {filter: <any>[], group: <any>[]});

我认为警告来自...value[0].filter...value[1].group,因为unknow上的变量类型keyvalue上的[key, value]

谢谢

1 个答案:

答案 0 :(得分:2)

首先,让我们使用const assertion来确保编译器理解body的每个属性都是tuple,其中第一个元素具有filter属性,并且第二个元素具有group属性。 (如果不正确,则您的value[0].filtervalue[1].group代码不安全):

const body = {
  A: [{ filter: [{ a: "a" }] }, { group: [{ a: "a" }] }],
  B: [{ filter: [{ a: "a" }] }, { group: [{ a: "a" }] }]
} as const;

您遇到的问题是:编译器看到您在调用array.reduce(callback, initialAccumulator),其中initialAccumulator是其中包含空数组的对象,并认为这些数组必须始终没有实元素(例如, ,Array<never>)。当您尝试将内容推入此类数组时,它会抱怨该内容不是never。您需要使用某种方式来注释或断言累加器将要保存一个数组,如下所示:

interface Filter { a: string }; // some type for Filter
interface Group { a: string }; // some type for Group
interface FiltersAndGroups {
  filter: Filter[];
  group: Group[];
}

// manually specify FiltersAndGroups as the accumulator type:     
var a = Object.entries(body).reduce<FiltersAndGroups>(
  (acc, [key, value]) => {
    acc.filter.push(...value[0].filter);
    acc.group.push(...value[1].group);
    return acc;
  },
  { filter: [], group: [] } 
)

选择FilterGroupFiltersAndGroups类型来表示累加器类型,并且(作为@ShanonJackson suggested)我们手动指定了reduce()数组可将[]的错误推断关闭为never[]的数组。

现在,它应该可以正常工作而不会受到投诉。希望能有所帮助。祝你好运!

Link to code