是否可以使用 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)
使用默认库中的参数类型
旧答案
你的情况:
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)
| 归档时间: |
|
| 查看次数: |
6663 次 |
| 最近记录: |