typescript - '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
我认为是因为变量类型unknow
onkey
和value
from[key, value]
谢谢
解决方案
首先,让我们使用一个const
断言来确保编译器理解每个属性body
都是一个元组,其中第一个元素有一个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)
where initialAccumulator
is 一个包含空数组的对象,并认为这些数组必须始终没有真正的元素(例如,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建议的那样)我们手动指定了reduce()
数组的泛型参数以关闭错误推断[]
为never[]
.
现在它应该可以毫无怨言地工作了。希望有帮助。祝你好运!
推荐阅读
- excel-formula - 按比例休假计算
- jenkins-pipeline - 为什么生成 DSL 时 Jenkins.get().getRootUrl() 不可用?
- linux - 一次运行多个作业并检查哪一个失败
- rust - Rust:用最少的小数点格式化浮点数
- java - 有没有办法在 postgres 测试容器中删除所有表或截断
- docker - 以分离模式启动时无法连接到在 Docker 容器中运行的 Airflow
- cmd - 使用开源 puppet 运行 cmd 命令
- c++ - 有没有办法让 Visual Studio 忽略特定的 vcpkg 库?
- ruby-on-rails - Has_Many_Through 未能推动许多人通过
- java - Java Spring Webflux WebClient - 使用 HTTP2 发送 http 请求