Typescript - 获取 typeof 函数参数

Bez*_*ezR 4 typescript redux

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

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

type login = (params: LoginParams) => dispatched
type dispatched = (dispatch: Dispatch) => Promise<any>
Run Code Online (Sandbox Code Playgroud)

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

GenericFunctionType<login>
Run Code Online (Sandbox Code Playgroud)

将创建以下类型:

(LoginParams) => Promise<any>
Run Code Online (Sandbox Code Playgroud)

简而言之 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;
};
Run Code Online (Sandbox Code Playgroud)

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

interface LoginProps {
  login: ???
}

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

connect(null, {login})(Login)
Run Code Online (Sandbox Code Playgroud)

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

小智 9

对于 TypeScript 3.0

我们可以将函数参数类型获取为元组类型,如下所示

type ArgsType<T> = T extends (...args: infer U) => any ? U : never;
Run Code Online (Sandbox Code Playgroud)


Mor*_*lod 6

使用默认库中的参数类型


旧答案

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

你的情况:

import { Arg1 } from 'tsargs';

type GenericFunctionType<F extends Function> = (params: Arg1<F>) => Promise<any>;
Run Code Online (Sandbox Code Playgroud)

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' ];
Run Code Online (Sandbox Code Playgroud)