解决此类问题的最佳解决方案是什么?

时间:2019-07-14 16:34:13

标签: typescript typescript-generics

我的示例:https://codesandbox.io/s/musing-clarke-rex8l src/index.ts

  enum EndpointEnum {
    summary,
    detailed
  }

  type Summary = string;
  type Detailed = number;

  const getData = <T>() => {
    return [] as T[];
  };

  const format = (format: Summary[]) => [];

  const main = <T>(someEnum: EndpointEnum) => {
    const data = getData<T>();

    if (someEnum === EndpointEnum.summary) {
      return format(data);
    } else {
      return data;
    }
  };

  main<Summary>(EndpointEnum.summary);
  main<Detailed>(EndpointEnum.detailed);

我对TypeScript很陌生。

您可以看到format函数仅接受String[],但我使用的是泛型类型。我真的不知道如何以一种优雅的方式解决它。

我能想到的两件事是做

const main = <T extends Summary | Detailed>(someEnum: EndpointEnum) => {

,然后键入format(data as Summary[]);

做一些难看的类型防护,也可以有效地进行类型转换。

有没有一种干净的方法?

1 个答案:

答案 0 :(得分:0)

实现此目标的一种方法是使format函数本身具有通用性,并强制其返回值为Summary[]

enum EndpointEnum {
    summary,
    detailed
}

type Summary = string;
type Detailed = number;

const getData = <T>(): T[] => {
    return [];
};

const format = <T>(format: T[]): Summary[] => [];

const main = <T>(someEnum: EndpointEnum) => {
    const data = getData<T>();

    if (someEnum === EndpointEnum.summary) {
        return format(data);
    } else {
        return data;
    }
};

main<Summary>(EndpointEnum.summary);
main<Detailed>(EndpointEnum.detailed);

那样做作为函数签名可能没有意义,但是稍后确实为您提供了一些实现灵活性。

例如,您可以在内部format调用其他更具体的格式化函数,最后仍然返回Summary[]

希望这能使您更接近所要寻找的东西。否则,正如您所说,您需要做一些extends或键入强制转换才能获得所需的结果。