typescript 有没有一种方法可以避免在JSON.parse reviver中返回`any`?

8ehkhllq  于 2023-03-31  发布在  TypeScript
关注(0)|答案(2)|浏览(130)

我有一个使用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类型的掉毛问题,或者必须禁用该行的掉毛规则?

8aqjt8rx

8aqjt8rx1#

eslint在这里有点过于热心了。或者至少那个规则不太适用于这个案子。
解析JSON本质上是一个类型不安全的过程。在这种情况下,any只是从参数类型传递过来,函数的类型是在一个你无法控制的地方返回any
所以我可能会把它转换为unknown,如下所示:

return value as unknown

这在某种程度上清楚地表明了“我不知道也不关心这是什么”。返回类型确实很重要,因为任何匹配any的返回类型都会在JSON.parse()的返回类型中使用。
这似乎是工作。
但这可能并不比禁用该行的规则好多少。哪一个是正确的,更多的是一个观点问题。
不过,我还是会选择as unknown的演员阵容。

9ceoxa92

9ceoxa922#

另一种解决方案是通过安装ts-reset作为devDependency来 * 重置 * 此返回类型。

// Import in a single file, then across your whole project...
import "@total-typescript/ts-reset";

// Get rid of the any's in JSON.parse and fetch
const result = JSON.parse("{}"); // unknown

注意事项

在应用程序中使用ts-reset,而不是库,因为它会使任何导入您的库的项目不知不觉地选择ts-reset。

相关问题