对于函数返回与返回的函数的返回类型替换返回类型功能通用打字稿类型(Generic TypeScrip

2019-10-29 05:22发布

亲爱的打字稿-3-大师在那里,

有人可以帮我定义泛型类型GuruMagic<T>它下面?

T是返回一个函数的函数,比如这个:

fetchUser(id: Id) => (dispatch: Dispatch) => Promise<boolean>

然后,泛型类型应更换 ReturnTypefetchUserReturnType的返回功能。 像这样:

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)

Answer 1:

是的,你可以做到这一点的条件类型 ,并通过支持在打字稿3.0中引入泛型参数列表操纵权力的元组类型在休息和蔓延的表达 。 下面是做这件事:

type GuruMagic<FF extends (...args: any[]) => (...args: any[]) => any> =
  FF extends (...args: infer A) => (...args: infer _) => infer R ? (...args: A) => R 
  : never;

所以,你推断该函数的参数列表FFA ,和函数的返回类型的返回类型FFR然后从参数列表返回一个新的功能, AR 它的工作原理?

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