【问题标题】:TypeScript error Argument of type '(response) => void' is not assignable to parameter of type '(value: void) => void | PromiseLike<void>'TypeScript 错误 '(response) => void' 类型的参数不可分配给 '(value: void) => void | 类型的参数PromiseLike<void>'
【发布时间】:2021-04-18 01:48:14
【问题描述】:

我用以下代码输入了这个问题:

“'(response: IResponse) => void' 类型的参数不能分配给'(value: void) => void | PromiseLike' 类型的参数”。

还有这个 check() 函数的问题。

你能帮帮我吗? 我真的不知道如何解决。 谢谢!

interface IResponse {
    isChecked: boolean;
}
type TResponse = IResponse;

.....

function dispatchAsync<TResponsePayload>(dispatch: Dispatch, actionType: string, asyncCall: () => Promise<TResponsePayload>): any;

....

check = async () => {
        const {actions, param} = this.props;
        await actions.getInfoById(param.id).then(
            (response: IResponse) => {
                this.setState({isChecked: response.isChecked});
            }
        );
    };

.....

getInfoById = async (id: string): Promise<void> =>
        dispatchAsync<TPermission>(this.dispatch, CHECK_ACTION, async () => {
            return await this.service.getInfoById(id);
        });

【问题讨论】:

    标签: javascript typescript types typeerror


    【解决方案1】:

    为了进一步解释,TypeScript 错误用另一种说法告诉你,你不能用一个需要参数的函数来代替一个不需要任何参数的函数。 想象一下这样的代码:

    const myArg = (param: number) => setState(param + 5);
    
    const caller = (arg: () => void) => arg();
    
    caller(myArg);

    很明显caller 在调用它的参数时不会提供任何参数。因此,用myArg 调用caller 将导致myArg 内部抛出错误,因为它不会收到它期望的参数。

    在您的示例中,getInfoById 返回Promise&lt;void&gt;。这意味着then 方法将不为提供的回调提供任何参数。这是根本原因。 你可以通过告诉 TypeScript getInfoById 实际上在 promise 中返回一些东西来修复它(在这种情况下,我假设它是 IResponse 类型)。 像这样:

    getInfoById = async (id: string): Promise<IResponse> =>
            dispatchAsync<TPermission>(this.dispatch, CHECK_ACTION, async () => {
                return await this.service.getInfoById(id);
            });

    【讨论】:

      【解决方案2】:

      您可以在下面查看您的代码:

      getInfoById = async (id: string): Promise<void> =>
          dispatchAsync<TPermission>(this.dispatch, CHECK_ACTION, async () => {
              return await this.service.getInfoById(id);
      });
      

      您可以将Promise&lt;void&gt; 中的void 更改为any 或您的特定数据类型。

      因为如果你使用void,你可以使用return。

      【讨论】:

        猜你喜欢
        • 2021-09-06
        • 2018-10-29
        • 1970-01-01
        • 2022-07-20
        • 2020-08-28
        • 1970-01-01
        • 2021-08-24
        • 2021-04-28
        • 1970-01-01
        相关资源
        最近更新 更多