【问题标题】:Typescript share function overload打字稿共享功能重载
【发布时间】:2020-02-06 09:20:43
【问题描述】:

假设我有一个具有多个重载的函数。有没有办法在不同的函数中“共享”相同的重载?

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;
}

如果我想在其他函数中使用相同的重载,我需要手动复制它们。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    如果你想共享类型,你可以这样做:

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

    然后你的新函数就这样输入:

    const newFunction: GetEmployeeFunctionType = (/** your parameters */) => {// implementation}
    

    当您调用 newFunction 时,它会为您提供正确的智能感知。

    【讨论】:

    • 我想在类的方法中使用它
    • 如果你想用它作为类方法你可以这样做:class SomeClass { public test: GetEmployeeFunctionType = () => { // implementation } }
    • 它不会出现在原型上。没有帮助。
    【解决方案2】:

    根据@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

    【讨论】:

    • 我想在类的方法中使用它
    • 以什么方式?你不能只做class A { public method = wrap(/* func */); } 吗?
    • 正常方式:method() { }
    • 实际上不,它不起作用...:/我删除了它。不知道这样是否可行
    【解决方案3】:

    截至 2020 年 5 月,此案例的语法目前不可用。 TypeScript 问题跟踪器中有相关问题:

    尽管有使用接口和调用签名的解决方法,如Kaca992's answer,但它们不会产生与您请求的语法相同的方法结构(并且在这些问题中提出)。

    【讨论】:

      猜你喜欢
      • 2019-09-30
      • 2017-02-03
      • 2017-08-22
      • 2022-01-24
      • 1970-01-01
      • 2020-04-25
      • 2021-06-30
      • 1970-01-01
      相关资源
      最近更新 更多