【问题标题】:Typescript - generic transformer typeTypescript - 通用变压器类型
【发布时间】:2020-10-31 19:01:34
【问题描述】:

我在使用泛型时遇到了一些麻烦,希望得到一些指导。 有一个工作示例available here。此示例旨在使示例保持简单。

我原以为Transformer 类型中的T 可以毫无问题地推断出来,但事实并非如此。 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'

【问题讨论】:

  • 第一个错误:你的 Transformer 类型不是通用的。它必须声明为type Transformer&lt;T, K&gt;。其次 - 你的 renderContent 也不是通用的,它可能应该有一个 &lt;T extends (string|number)&gt; 通用参数。第三:K是什么类型?第四:const identity = &lt;T&gt;(a: T) =&gt; a;
  • 您在寻找this吗?

标签: typescript typescript-typings typescript2.0 typescript-generics


【解决方案1】:

感谢@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'}

【讨论】:

    猜你喜欢
    • 2021-03-01
    • 2017-06-24
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多