亲爱的打字稿-3-大师在那里,
有人可以帮我定义泛型类型GuruMagic<T>
它下面?
T
是返回一个函数的函数,比如这个:
fetchUser(id: Id) => (dispatch: Dispatch) => Promise<boolean>
然后,泛型类型应更换 ReturnType
的fetchUser
与ReturnType
的返回功能。 像这样:
type dispatchedAction = GuruMagic<typeof fetchUser>;
// so that dispatchedAction === (id: Id) => Promise<boolean>
我知道,我可以申请ReturnType
两次拿到Promise<boolean>
,但我不知道如何Concat的原始参数(可能是多个)这个返回类型。 这甚至可能以打字稿(3.X)?
为了清楚起见,其它的例子
const f1 = (a: number, b: string) => () => a;
type guruF1 = GuruMagic<typeof f1>; // (a: number, b: string) => number
const f2 = () => (name: string) => (otherName: string) => name + otherName;
type guruF2 = GuruMagic<typeof f2>; // () => (otherName: string) => string
动机
类型安全的Redux-Thunk
。 当我connect
一个react
成分这将是巨大的,如果我可能只是这样做:
import { fetchUser } from './myActions';
interface IPropsOfMyComponent {
fetchUser: GuruMagic<typeof fetchUser>;
}
// ... MyComponent Definition ...
connect<{}, IPropsOfMyComponent, {}>(null, { fetchUser })(MyComponent)
是的,你可以做到这一点的条件类型 ,并通过支持在打字稿3.0中引入泛型参数列表操纵权力的元组类型在休息和蔓延的表达 。 下面是做这件事:
type GuruMagic<FF extends (...args: any[]) => (...args: any[]) => any> =
FF extends (...args: infer A) => (...args: infer _) => infer R ? (...args: A) => R
: never;
所以,你推断该函数的参数列表FF
为A
,和函数的返回类型的返回类型FF
为R
然后从参数列表返回一个新的功能, A
到R
它的工作原理?
declare function fetchUser(id: Id): (dispatch: Dispatch) => Promise<boolean>
type dispatchedAction = GuruMagic<typeof fetchUser>;
// (id: Id) => Promise<boolean>
const f1 = (a: number, b: string) => () => a;
type guruF1 = GuruMagic<typeof f1>;
// (a: number, b: string) => number
const f2 = () => (name: string) => (otherName: string) => name + otherName;
type guruF2 = GuruMagic<typeof f2>;
// () => (otherName: string) => string
是的,它确实!
我不是100%肯定你将如何在实践中使用这种类型的功能......,它忽略了中间函数的参数类型的事实令我担忧。 如果你试图真正实现类型的函数GuruMagic<T>
给定类型的功能T
,除非您提供缺少的参数在某种程度上,你将有一个问题。 但是,也许你甚至没有实施GuruMagic<T>
给出一个T
。 无论如何,这是你的业务,不是我的。
无论如何,希望有所帮助。 祝好运!
文章来源: Generic TypeScript Type for functions returning functions that replaces the ReturnType with the ReturnType of the returned function