我的示例: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[]);
或
做一些难看的类型防护,也可以有效地进行类型转换。
有没有一种干净的方法?
答案 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
或键入强制转换才能获得所需的结果。