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

poc*_*sar 4 overloading typescript

我正在尝试重载一个函数,因此在其他地方使用该函数时,它将正确显示结果,即项目数组、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;
   });
}
Run Code Online (Sandbox Code Playgroud)

它给了我错误“错误 TS2175:重载不能仅因返回类型而异。” . 那么,我如何才能表明返回类型的多种可能性呢?

Fen*_*ton 7

值得注意的是关于您的原始代码的几点...

您不能调用实现签名。

这些是“重载签名” - 您可以调用它们。

getSelected(type): void;
getSelected(type): IDataItem;
getSelected(type): IDataItem[];
Run Code Online (Sandbox Code Playgroud)

下一行是“实现签名”——你不能直接调用它。

getSelected(type:string, one:boolean = true):any {
Run Code Online (Sandbox Code Playgroud)

这意味着就目前而言,您永远无法传递one参数。

您需要键入type参数。

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

type: string
Run Code Online (Sandbox Code Playgroud)

根据布尔参数值不同

您的签名,指出如果传递trueone参数,你会得到一个结果。如果您要传递 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!
}
Run Code Online (Sandbox Code Playgroud)

当您调用它时,将根据传递的参数推断类型。这是它的形状,您的代码已从实际方法中删除...

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);
Run Code Online (Sandbox Code Playgroud)