我收到警告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
上的变量类型key
和value
上的[key, value]
>
谢谢
答案 0 :(得分:2)
首先,让我们使用const
assertion来确保编译器理解body
的每个属性都是tuple,其中第一个元素具有filter
属性,并且第二个元素具有group
属性。 (如果不正确,则您的value[0].filter
和value[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: [] }
)
选择Filter
,Group
和FiltersAndGroups
类型来表示累加器类型,并且(作为@ShanonJackson suggested)我们手动指定了reduce()
数组可将[]
的错误推断关闭为never[]
的数组。
现在,它应该可以正常工作而不会受到投诉。希望能有所帮助。祝你好运!