打字稿共享功能重载

时间:2020-02-06 09:20:43

标签: typescript

假设我有一个具有多个重载的函数。有什么办法可以在不同的功能中“共享”相同的重载?

function getEmployee(id: number): Employee;
function getEmployee(email: string): Employee;
function getEmployee(email: number, name: string): Employee;
function getEmployee (paramOne: string | number, paramTwo?: string ): Employee { 
  return employee;
}

如果要在其他函数中使用相同的重载,则需要手动复制所有重载。

3 个答案:

答案 0 :(得分:0)

如果您要共享类型,可以执行以下操作:

//about-us page 
<ion-header>
  <ion-navbar>
    <ion-title>{{"About_The_School" | translate}}</ion-title>
  </ion-navbar>
</ion-header>
<ion-content *ngIf="aboutUsData">
  <div margin-top text-center class="school_img">
    <img [src]="aboutUsData.school_logo">
    <h4>{{aboutUsData.school_name}}</h4>
    <p>{{aboutUsData.about_text}}</p>
  </div>
</ion-content>

然后您的新函数只需像这样键入它:

interface GetEmployeeFunctionType {
    (id: number): Employee;
    (email: string): Employee;
    (email: number, name: string): Employee;
    (paramOne: string | number, paramTwo?: string): Employee;
}

调用newFunction时,它将为您提供正确的智能提示。

答案 1 :(得分:0)

根据@ Kaca992答案,我认为应该以某种方式对其进行更改,因为最后一个签名不是过载签名,而是实现签名。

interface GetEmployeeFunctionType {
    (id: number): Employee;
    (email: string): Employee;
    (email: number, name: string): Employee;
}

const newFunction: GetEmployeeFunctionType = (paramOne: string | number, paramTwo?: string): Employee => {/* implementation */}

另一方面,您始终可以创建一个高阶函数来包装签名:

interface GetEmployeeFunctionType {
    (id: number): Employee;
    (email: string): Employee;
    (email: number, name: string): Employee;
}

function wrap(func: (paramOne: string | number, paramTwo?: string) => Employee): GetEmployeeFunctionType {
    return func;
}

// usage:
const f = wrap((arg1, arg2) => {/* implementation */});

为此,请参见TypeScript Playgound

答案 2 :(得分:0)

截至2020年5月,此情况的语法当前不可用。 TypeScript问题跟踪器中存在相关问题:

尽管在Kaca992's answer中有使用接口和调用签名的变通办法,但它们的方法结构与您要求的语法(在这些问题中提出的)不同。