gpt4 book ai didi

reactjs - TypeScript:类型 'T' 不满足约束 '(...args: any) => any'

转载 作者:行者123 更新时间:2023-12-04 14:35:33 25 4
gpt4 key购买 nike

我有以下 redux-thunk Action 创建者:

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;

我正在尝试导出绑定(bind) thunk 操作的类型。简而言之,当action creator在react-redux中被“绑定(bind)”时,它会自动调用返回的函数 dispatch然后返回该内部函数的返回结果。我正在尝试为这种行为声明一个类型。如果我在没有泛型的情况下这样做,它会起作用:
type BoundUpdateInitiator = (...args: Parameters<UpdateInitiator>) => ReturnType<ReturnType<UpdateInitiator>>;

但是当我尝试为任何绑定(bind)函数声明泛型类型时,我遇到了一些麻烦:
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>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>>;

关于reactjs - TypeScript:类型 'T' 不满足约束 '(...args: any) => any',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60879582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com