关于原始代码值得注意的几点......
您无法调用实现签名。
这些是“重载签名”——您可以这样称呼它们。
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);