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:重载不能仅因返回类型而异。” . 那么,我如何才能表明返回类型的多种可能性呢?
值得注意的是关于您的原始代码的几点...
这些是“重载签名” - 您可以调用它们。
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)
您的签名,指出如果传递true的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!
}
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)
| 归档时间: |
|
| 查看次数: |
2846 次 |
| 最近记录: |