我的例子: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
或类型转换才能获得所需的结果。