Как специализировать тип generi c в литерале объекта? - PullRequest
1 голос
/ 06 августа 2020
// a.ts
interface Config {
    selector?: <T>(httpResponse: HttpResponse<T>) => unknown;
}

export function factory(options: Config): something {
    // use options to return something
}

// another file b.ts
// I have a type for res only here(b.ts), and I want to use it to specialize type T

import { factory } from 'a.ts';

factory({
    selector: res => res.data.data; // error: Property 'data' does not exist on type 'T'
});

Мой вопрос: как передать указанный тип в литерале объекта конфигурации, чтобы универсальный c тип T мог быть специализированным?

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Сделайте factory для функции generi c, и мы можем передать «T» из factory в Config, что также является универсальным c объектом.

Начать с Config интерфейс, сделайте его общим c интерфейсом.

interface Config<T> { // Generically for whole interface
    selector?: (httpResponse: HttpResponse<T>) => unknown;
}

Следующая, factory функция:

export function factory<T>(options: Config<T>): something { // return type is "T" or something ?
    // use options to return something
}

Мы передаем тип «T» от factory до Config.

Наконец, пример:

b.ts

export type ApiResponse = {
    data: {
        username: string;
    }
}

Использование фабрики

factory<ApiResponse>({
    selector: res => res.data.data.username, // typehint for the `res`, I try with HttpResponse is AxiosResponse
});
0 голосов
/ 06 августа 2020

Я не знаю, каков ваш конкретный вариант использования, но вы можете добавить тип в свой интерфейс следующим образом:

interface Config<T> {
  selector?: (httpResponse: T) => unknown;
}

function factory(options: Config<{ data: { data: string } }>) {
  // use options to return something
  return options;
}

factory({
  selector: (res) => res.data.data,
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...