【问题标题】:Typescript - Get typeof function argumentsTypescript - 获取 typeof 函数参数
【发布时间】:2018-06-04 13:23:48
【问题描述】:

是否可以使用 TypeScript 获取函数参数的类型?

我有一个返回另一个函数的函数,该函数返回一个承诺:

type login = (params: LoginParams) => dispatched
type dispatched = (dispatch: Dispatch) => Promise<any>

我想创建一个泛型类型,它将函数作为参数并创建一个新的函数类型。例如:

GenericFunctionType<login>

将创建以下类型:

(LoginParams) => Promise<any>

简而言之,GenericFunctionType 使用初始函数的参数(登录)和返回函数的返回值(调度)创建一个函数类型。


我想要这个,因为我正在使用 Redux。这是我的用例:

//Action Creator
export type login = (params: LoginParams) => ThunkAction<Promise<any>>;

export const login: login = params => async dispatch => {
  dispatch({ type: LOGIN });

  const promise = httpClient.post('/auth/sign_in', params);

  ...stuff

  return promise;
};

我的登录组件是这样连接的:

interface LoginProps {
  login: ???
}

class Login extends React.component<LoginProps, {}> {...}

connect(null, {login})(Login)

我正在尝试找到一种可重用的方式来键入已包装在 dispatch 中的动作创建者(这就是 connect 所做的)。

【问题讨论】:

  • 我认为这是不可能的。类型不是数据,泛型类型不是返回其他类型的函数,也不是包含其参数的对象。看起来您实际上是在尝试导出两种类型。我建议将您的登录功能包装在一个模块中,该模块导出您的登录功能和两种类型,Params (loginParams) 和 Result (Promise)。

标签: typescript redux


【解决方案1】:

使用默认库中的Parameters 类型


旧答案

您可以为此使用 npm 中的 tsargs 包。

你的情况:

import { Arg1 } from 'tsargs';

type GenericFunctionType<F extends Function> = (params: Arg1<F>) => Promise<any>;

带有 tsargs 的示例:

import { Arg2, Args2off1, ArgsN } from 'tsargs';

function foo(a: boolean, b: number, c: string) {}

// pick specific argument
const secondArg: Arg2<typeof foo> = 123;

// pick 2 arguments skipping first
const argsBC: Args2off1<typeof foo> = [ 123, 'Hello' ];

// pick all arguments
const argsABC: ArgsN<typeof foo> = [ true, 123, 'Hello' ];

【讨论】:

    【解决方案2】:

    对于 TypeScript 3.0

    我们可以得到如下的元组类型的函数参数类型

    type ArgsType<T> = T extends (...args: infer U) => any ? U : never;
    

    【讨论】:

    • 而问题的答案是:type GenericFunctionType&lt;T, R = any&gt; = T extends (...args: infer U) =&gt; any ? (...args: U) =&gt; Promise&lt;R&gt; : never;
    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-23
    • 2020-01-19
    • 2017-12-30
    相关资源
    最近更新 更多