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

标签 typescript overloading

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

相关文章:

angular - 将变量从一个 typescript 文件导入另一个

jquery - 我可以在 typescript 中覆盖 document.ready 吗

angular - *ngFor 循环中的解构赋值

azure - 内部版本 : Cannot use JSX unless the '--jsx' flag is provided

C++ - 在传递到 `std::function` 时指定重载的仿函数或函数

reactjs - 将 react-hook-form 与 typescript 和 material-ui 一起使用以显示错误消息的正确方法

c++ - ostream 的问题

C++ 模板这可能吗?

c++ - 重载+运算符,链表

c# - 可选参数: reversed precedence if override of overload exists