【问题标题】:Argument of type 'unknown' is not assignable to parameter of type 'string'. TS2345“未知”类型的参数不能分配给“字符串”类型的参数。 TS2345
【发布时间】:2021-11-02 07:54:15
【问题描述】:

我正在运行这段代码,刚刚看到这个错误出现。

import { ethers } from 'ethers'
import { getMulticallContract } from 'utils/contractHelpers'
import { MultiCallResponse } from './types'

export interface Call {
  address: string // Address of the contract
  name: string // Function name on the contract (example: balanceOf)
  params?: any[] // Function params
}

interface MulticallOptions {
  requireSuccess?: boolean
}

const multicall = async <T = any>(abi: any[], calls: Call[]): Promise<T> => {
  try {
    const multi = getMulticallContract()
    const itf = new ethers.utils.Interface(abi)

    const calldata = calls.map((call) => [call.address.toLowerCase(), itf.encodeFunctionData(call.name, call.params)])
    const { returnData } = await multi.aggregate(calldata)

    const res = returnData.map((call, i) => itf.decodeFunctionResult(calls[i].name, call))
    

    return res
  } catch (error) {
    throw new Error(error)
  }
}

这是我遇到的错误,尽管到目前为止它一直运行良好。

Argument of type 'unknown' is not assignable to parameter of type 'string'.  TS2345

    28 |     return res
    29 |   } catch (error) {
  > 30 |     throw new Error(error)
       |                     ^
    31 |   }
    32 | }
    33 |

我已经查看了相关问题,但在这种情况下看不到任何确切的解决方案,而且我目前正在学习打字稿。

【问题讨论】:

  • 如果你只是“抛出错误”而不是“抛出新的错误(错误)”怎么办
  • catch 子句的意义何在?你希望try 块中的代码抛出什么样的error

标签: javascript reactjs typescript jsx


【解决方案1】:

最后我只是在 tsconfig 中添加了"useUnknownInCatchVariables": false,,它阻止了错误被转换为未知,这就是导致这个问题的原因。

我相信我也必须升级 typescript,因为 tsconfig 中有一个关于这个标志的警告Unknown compiler option 'useUnknownInCatchVariables'.

另请参阅文档中提到的另一种解决方案:https://www.typescriptlang.org/tsconfig#useUnknownInCatchVariables

try {
  // ...
} catch (err) {
  // We have to verify err is an
  // error before using it as one.
  if (err instanceof Error) {
    console.log(err.message);
  }
}

【讨论】:

  • 你真的不应该关闭检查,而应该修复你的代码。可以说,如果抛出了 Error 实例,那么您的调用 new Error(error) 就会中断。
  • 您读到了吗:typescriptlang.org/tsconfig#useUnknownInCatchVariables 第一行.. 在 TypeScript 4.0 中,添加了支持以允许将 catch 子句中的变量类型从任何更改为未知。变量的类型发生了变化,在此之前错误调用工作正常。
  • 不,代码不起作用。是的,编译器没有抱怨,现在也抱怨了,但是无论您使用什么 Typescript 版本,将 Error 实例作为参数传递给 new Error 都是错误的。
【解决方案2】:

在这种情况下,你永远不知道会抛出什么类型的错误(unknown),而new Error() 会收到一个字符串

根据您的 multicall 函数的上下文,我建议您为该错误添加一个有意义的字符串(生产级网络通常会这样做)

你会抛出这样的东西:

const multicall = async <T = any>(abi: any[], calls: Call[]): Promise<T> => {
  try {
    const multi = getMulticallContract();
    const itf = new ethers.utils.Interface(abi);

    const calldata = calls.map((call) => [
      call.address.toLowerCase(),
      itf.encodeFunctionData(call.name, call.params),
    ]);
    const { returnData } = await multi.aggregate(calldata);

    const res = returnData.map((call, i) => itf.decodeFunctionResult(calls[i].name, call));

    return res;
  } catch {
    throw new Error('something went wrong in the multical function');
  }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2021-08-18
    • 2018-08-10
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    相关资源
    最近更新 更多