重载不能仅因返回类型而不同

2023-12-06

我正在尝试重载一个函数,因此当在其他地方使用该函数时,它将正确显示结果,即项目数组、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范围。

您的重载没有指定类型type参数,这些将有any类型 - 但我认为你可能想将其限制为字符串。每个签名都需要注释...

type: string

根据布尔参数值而有所不同

您的签名表明如果你通过true in the one争论,你会得到一个结果。如果你传递 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重载不能仅因返回类型而不同 的相关文章