我收到了警告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
,因为key
上变量类型为unknow
,而[key, value]
上的变量类型为value
谢谢
发布于 2019-06-25 09:01:48
首先,让我们使用一个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[]
数组的错误推断。
现在,它应该可以毫无抱怨地工作了。希望这能有所帮助。祝好运!
https://stackoverflow.com/questions/56745339
复制相似问题