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



我的例子: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[]);

做一些丑陋的类型防护,这也将是有效的类型转换。

有没有办法以干净的方式做到这一点?

实现

此目的的一种方法是使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或类型转换才能获得所需的结果。

最新更新