reactjs - TypeScript:类型 'T' 不满足约束 '(...args: any) => any'
问题描述
我有以下 redux-thunk 动作创建者:
function updateInitiator(form_request_id, { to_recipient }) {
return (dispatch) => {
const url = `/some/url`;
const data = { to_recipient };
return fetch(url, { method: 'PUT', body: JSON.stringify(data) }).then(() => {
dispatch(fetchResponses());
});
};
}
然后我声明函数的类型:
type UpdateInitiator = typeof updateInitiator;
我正在尝试导出绑定 thunk 动作的类型。简而言之,当 action creator 在 react-redux 中“绑定”时,它会自动调用返回的函数dispatch
,然后返回该内部函数的返回结果。我正在尝试为这种行为声明一个类型。如果我在没有泛型的情况下这样做,它会起作用:
type BoundUpdateInitiator = (...args: Parameters<UpdateInitiator>) => ReturnType<ReturnType<UpdateInitiator>>;
但是当我尝试为任何绑定函数声明一个泛型类型时,我遇到了一些麻烦:
type BoundThunk<T> = (...args: Parameters<T>) => ReturnType<ReturnType<T>>;
type BoundUpdateInitiator = BoundThunk<UpdateInitiator>;
这给了我错误:
error TS2344: Type 'T' does not satisfy the constraint '(...args: any) => any'.
236 type BoundThunk<T> = (...args: Parameters<T>) => ReturnType<ReturnType<T>>;
~
error TS2344: Type 'ReturnType<T>' does not satisfy the constraint '(...args: any) => any'.
Type 'unknown' is not assignable to type '(...args: any) => any'.
Type '{}' provides no match for the signature '(...args: any): any'.
236 type BoundThunk<T> = (...args: Parameters<T>) => ReturnType<ReturnType<T>>;
~~~~~~~~~~~~~
error TS2344: Type 'T' does not satisfy the constraint '(...args: any) => any'.
236 type BoundThunk<T> = (...args: Parameters<T>) => ReturnType<ReturnType<T>>;
~
我可以隐约理解,这T
可能是函数以外的东西,同样也ReturnType<T>
可能不是函数,而这种泛型类型可能不考虑这些情况。但是,我无法理解如何解释它们。理想情况下不允许他们。有什么建议么?
解决方案
为了实现这一点,我们将使用泛型类型约束。
实际上,这就是语言的类型参数如何提供实用程序类型Parameters<T>
和ReturnType<T >
指定的方式,以及导致错误的原因。
为了实例化一个泛型类型,比如说ReturnType<T>
,使用我们的类型参数,我们的类型参数必须至少与 中的类型参数一样受到T
限制 ReturnType<T>
。
通过查看定义ReturnType<T>
我们可以确定最小约束(正式称为上限),我们需要应用和关联的语法
type ReturnType<T extends (...args: any) => any> =
// details
不要担心实施(在 之后=
),因为这是一个更广泛的话题。在这种情况下,我们将重点关注在声明中T
使用extends
关键字指定的约束T
。
因此,为了T declared
通过BoundThunk<T>
to,ReturnType<T>
我们必须对其进行约束以满足上述要求(注意Parameters<T>
具有相同的约束)。
type BoundThunk<T extends (...args: any) => any> =
(...args: Parameters<T>) => ReturnType<ReturnType<T>>;
但是,我们的要求T
实际上更具限制性,因为我们应用ReturnType<T>
了两次 , ReturnType<ReturnType<T>>
,这意味着这T
是一个更高阶的函数,在这种情况下是一个返回函数的函数。
因此,我们将相应地细化我们的约束
type BoundThunk<T extends (...args: any) => (...args: any) => any> =
(...args: Parameters<T>) => ReturnType<ReturnType<T>>;
推荐阅读
- kubernetes - 在 Airflow Cloud Composer 中从 Kubernetes Pod Operator 推送 Docker 镜像
- payment - Adyen,无需付款即可为信用卡创建令牌
- javascript - Typedoc 错误:尝试设置未声明的选项(模式)
- http-live-streaming - 使用 Stream/RAF Tester 调试 Roku 技巧模式
- c++ - 递归获取提升属性树中所有值的完整关键路径
- hardware - 硬件中的轮询与握手
- entity-framework - 除非更改,否则 DropDownListFor 不会保存
- javascript - 使用 ES6 模块时,设置了 --watch 标志的 Mocha 会引发错误
- python - 如何动态启动嵌套字典并将值分配给嵌套字典
- node.js - standard_init_linux.go:219: exec 用户进程导致:没有这样的文件或目录 - docker 问题