【问题标题】: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<void>。这意味着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<void> 中的void 更改为any 或您的特定数据类型。
因为如果你使用void,你可以使用return。