Машинопись - generi c тип трансформатора - PullRequest
0 голосов
/ 11 июля 2020

У меня небольшие проблемы с дженериками, и я надеялся на некоторые рекомендации. Здесь есть рабочий пример . Этот пример создан для упрощения примера.

Я бы подумал, что T в типе Transformer будет выведен без проблем, но это не так. Причина, по которой Transformer возвращает T | K, заключается в том, что преобразователь по умолчанию использует identity функцию

const multiply = (a: number) => (b: number) => a * b;
const identity = <T extends any>(a: T) => a;
const toInt = (a: string) => parseInt(a, 10);
const by10 = multiply(10);

type Transformer = <T, K>(value: T) => T | K;

const renderContent = (
  value: string | number,
  transformer: Transformer = identity
) => {
  const transformed = transformer(value);
  console.log(transformed);
  return transformed;
};

renderContent(50, by10); // Type 'T' is not assignable to type 'number'
renderContent("50", toInt); // Type 'T' is not assignable to type 'string'

1 Ответ

0 голосов
/ 12 июля 2020

Благодаря fantasti c ответы от @zerkms и @jcalz вот окончательный ответ:

const updateDatabase = <K>(value: K) => console.log(value);
const multiply = (a: number) => (b: number) => a * b;
const by10 = multiply(10);
const identity = <A>(a: A) => a;
const toInt = (numStr: string) => parseInt(numStr, 10);
const toStr = (num: number) => String(num);

type TransformerFn<V, T> = (value: V) => V | T;
type Option = { id: string; label: string };
type ValidInput = string | number | Option;

const renderValue = <V extends ValidInput, T extends ValidInput>(
  value: V,
  transformer: TransformerFn<V, T> = identity
) => {
  const transformed = transformer(value);
  updateDatabase(transformed);
  return transformed;
};

renderValue(10); // => 10
renderValue("10", toInt); // => 10
renderValue(10, toStr); // => '10'
renderValue(10, by10); // => 100
renderValue({ id: "blue", label: "Blue" }); // => {id: blue, label: 'Blue'}
...