我有一个使用TypeScript和ESLint的项目。我需要反序列化JSON字符串,并希望利用可选的reviver参数。reviver函数基本上可以让您有条件地转换值作为JSON反序列化的一部分。
reviver函数的签名被定义为JSON.parse规范的一部分,它是:
JSON.parse(text: string, reviver?: ((this: any, key: string, value: any) => any) | undefined): any
特别是:它接受any
类型的value
,并返回any
类型的值。
const deserializedValue: unknown = JSON.parse(serializedValue, (key, value) => {
if (value === 'foo') {
return 'bar
}
return value
}
我被ESLint骂了,因为当我写return value
时,我返回了any
类型的东西:
5:4 error Unsafe return of an `any` typed value @typescript-eslint/no-unsafe-return
有没有一种方法可以通过编程方式避免在反序列化的未知特性约束下any
类型的掉毛问题,或者必须禁用该行的掉毛规则?
2条答案
按热度按时间8aqjt8rx1#
eslint在这里有点过于热心了。或者至少那个规则不太适用于这个案子。
解析JSON本质上是一个类型不安全的过程。在这种情况下,
any
只是从参数类型传递过来,函数的类型是在一个你无法控制的地方返回any
。所以我可能会把它转换为
unknown
,如下所示:这在某种程度上清楚地表明了“我不知道也不关心这是什么”。返回类型确实很重要,因为任何匹配
any
的返回类型都会在JSON.parse()
的返回类型中使用。这似乎是工作。
但这可能并不比禁用该行的规则好多少。哪一个是正确的,更多的是一个观点问题。
不过,我还是会选择
as unknown
的演员阵容。9ceoxa922#
另一种解决方案是通过安装ts-reset作为devDependency来 * 重置 * 此返回类型。
注意事项
在应用程序中使用ts-reset,而不是库,因为它会使任何导入您的库的项目不知不觉地选择ts-reset。