我正在尝试重载一个函数,因此当在其他地方使用该函数时,它会正确显示结果,即项目数组、void 或单个项目:
getSelected(type): void;
getSelected(type): IDataItem;
getSelected(type): IDataItem[];
getSelected(type:string, one:boolean = true):any {
if (!type) {
return;
}
if (one) {
return _.reduce<IDataItem, IDataItem>(sections[type], (current: IDataItem, p: IDataItem) => {
return p.selected === true ? p : current;
}, void 0);
}
return _.filter<IDataItem>(sections[type], (p: IDataItem):boolean => {
return p.selected === true && p.enabled === true;
});
}
它给我错误“错误 TS2175:重载不能仅因返回类型而异。”。那么,我怎样才能仅表示返回类型的多种可能性呢?
最佳答案
关于您的原始代码,有几点值得注意...
您不能调用实现签名。
这些是“重载签名”——您可以调用它们。
getSelected(type): void;
getSelected(type): IDataItem;
getSelected(type): IDataItem[];
下一行是“实现签名”——你不能直接调用它。
getSelected(type:string, one:boolean = true):any {
这意味着就目前而言,您永远无法传递 one
参数。
您需要输入类型
参数。
您的重载没有为 type
参数指定类型,它们将具有 any
类型 - 但我认为您可能希望将其限制为字符串。每个签名都需要注释...
type: string
根据 bool 参数值不同
您的签名声明如果您在one
参数中传递true
,您将得到一个结果。如果你传递 false,你会得到多个结果。我们现在可以使用它,因为 TypeScript 已经变得更加出色。见下文...
工作重载。
鉴于所有这些信息,您可以使用:
getSelected(type: string): void;
getSelected(type: string, one: true): IDataItem;
getSelected(type: string, one: false): IDataItem[];
getSelected(type: string, one: boolean = true): any {
// ... code!
}
当您调用它时,将根据传递的参数推断类型。这是它的形状,您的代码已从实际方法中删除...
interface IDataItem {
name: string;
}
class Example {
getSelected(type: string): void;
getSelected(type: string, one: true): IDataItem;
getSelected(type: string, one: false): IDataItem[];
getSelected(type: string, one: boolean = true): void | IDataItem | IDataItem[] {
// ... code!
}
}
const example = new Example();
// void return
example.getSelected('just type');
// IDataItem
const a = example.getSelected('x', true);
// IDataItem[]
const b = example.getSelected('x', false);
关于typescript - 重载不能仅因返回类型而异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25022331/