首页 > 解决方案 > 'any' 类型的参数不能分配给'never'.ts 类型的参数

问题描述

我收到警告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我认为是因为变量类型unknowonkeyvaluefrom[key, value]

谢谢

标签: typescript

解决方案


首先,让我们使用一个const断言来确保编译器理解每个属性body都是一个元组,其中第一个元素有一个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)where initialAccumulatoris 一个包含空数组的对象,并认为这些数组必须始终没有真正的元素(例如,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,GroupFiltersAndGroups类型来表示累加器类型,并且(正如@ShanonJackson建议的那样)我们手动指定了reduce()数组的泛型参数以关闭错误推断[]never[].

现在它应该可以毫无怨言地工作了。希望有帮助。祝你好运!

链接到代码


推荐阅读