Typescript generi c ошибка вывода возвращаемого значения - PullRequest
0 голосов
/ 23 апреля 2020

Я не уверен, что это ошибка в TS или что-то, что они считают неподдерживаемой функцией. MVE:

interface ColumnOptions<R> {
  valueFormatter(params: R): string;
  valueGetter(params: string): R;
}

const getColumn = function<R>(options: ColumnOptions<R>) {};

getColumn({
  valueFormatter: params => 'hello',
  valueGetter: params => ({
    nr: 1,
    str: 'hello',
  }),
});

Это для определения столбца Ag-сетки, и цель состоит в том, чтобы вывести, что параметр valueFormatter исходит из типа возврата valueGetter. Параметр valueFormatter (R) выводится как unknown в приведенном выше случае, но если я явно наберу или удаляю параметр valueGetter, например:

getColumn({
  valueFormatter: params => 'hello',
  valueGetter: () => ({
    nr: 1,
    str: 'hello',
  }),
});

, это выводит R правильно , Это то, что заставляет меня предположить, что это может быть ошибка в TS, но, возможно, это просто не поддерживается, и я не хочу открывать проблему на GitHub, если это так. Протестировано с TS 3.8, 3.7, 3.5 и 3.0

1 Ответ

1 голос
/ 23 апреля 2020

Насколько я понимаю, ваш код создает циклически зависимую пару.

R может быть выведена из одной из функций как solid, экземплярный тип , а затем использоваться в качестве ссылки для вывода сигнатуры функции другой, если она неполная или неизвестна.

Но для того, чтобы это работало, сначала нужно предоставить хотя бы один тип solid, чтобы разорвать круг. Вот что происходит, когда вы удаляете param из valueGetter, потому что вы отменяете запрос TS для определения типа параметра, делая функцию valueGetter полным solid типом. Таким образом, возвращаемый тип может использоваться в качестве логического типа для R.

Ниже также будет работать, если вы предоставите явный тип для params: string

getColumn({
  valueFormatter: params => 'hello',
  valueGetter: (params: string) => ({
    nr: 1,
    str: 'hello',
  }),
});
...