Могу ли я передать функцию (и получить ее ReturnType) в общий тип TypeScript? - PullRequest
0 голосов
/ 08 октября 2019

Итак, мой код выглядит следующим образом. В идеале я хотел бы получить следующее как тип: LoginPayload<login>.

Я не могу понять, какие конструкции передают любую функцию в качестве универсального параметра и получить его тип возвращаемого значения.

export type LoginPayload = ReturnType<typeof login>

const login = createAction('customer/login', function prepare({ username, password }: LoginRequest) {
  return { payload: { username, password } }
})

Чего бы я хотел достичь:

export type LoginPayload<F> = ReturnType<typeof F>

const login = createAction('customer/login', function prepare({ username, password }: LoginRequest) {
  return { payload: { username, password } }
})

//use: LoginPayload<login>

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 10 октября 2019

Не уверен, если это то, что вы ищете, но я попробую:

Если вы используете пакет redux-actions, тип возвращаемого значения login (функция, созданная вызовомcreateAction) будет Action<Payload>. Payload - это параметр типа, который выводится из типа возвращаемого значения переданного в обратном вызове prepare.

Действие (из действий приставки):

export interface BaseAction {
    type: string;
}

export interface Action<Payload> extends BaseAction {
    payload?: Payload;
    error?: boolean;
}

Если вы не можете использовать явный, известный тип для возвращаемого типа обратного вызова prepare, Payload может быть выведен следующим образом (предполагается, что string type для user + pw в примере):

type InferPayload<T> = T extends Action<infer I> ? I : never

/*
type Payload = {
    payload: {
        username: string;
        password: string;
    };
}
*/
type Payload = InferPayload<ReturnType<typeof login>>

Таким образом, в целом Action<Payload> будет иметь такой тип:

{
    payload?: {
        payload: {
            username: string;
            password: string;
        };
    } | undefined;
    error?: boolean | undefined;
    type: string;
}

Детская площадка

...