【问题标题】:In Typescript, how can I implementing bare function interface with overloads?在 Typescript 中,如何实现带有重载的裸函数接口?
【发布时间】:2017-07-29 08:39:18
【问题描述】:

我正在使用 Typescript 2.3.3

我正在尝试为我正在编写的一些代码创建一个不错的 API,因此我正在尝试使用 Typescript 的泛型。

我希望能够调用具有泛型类型的函数,并使用该类型向用户呈现选择,其中一些可能是具有不同签名的函数。

这是我目前的尝试。

我声明了一个带有两个裸函数签名的接口(我想向开发人员展示这两个选项):

interface api<T1> {

  <T2>(second: T2):  {
    first: T1
    second: T2;
  };

  <T2, T3>(second: T2, third: T3):  {
    first: T1
    second: T2;
    third: T3;
  };

}

我创建了一个函数,其中包含每个函数签名的实现,使用传递给它的泛型类型参数:

const test = <TFirst>(first: TFirst) : api<TFirst> => {

  const impl1 = <T2>(second: T2) => ({
    first, second
  });

  const impl2 = <T2, T3>(second: T2, third: T3) =>({
    first, second, third
  });

  return ...?
};

不过,我不知道在哪里分配这些实现或如何创建符合 api 规范的返回对象。

这可能吗?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    这是可能的。你可以这样做:

    interface api<T1> {
    
      <T2>(second: T2):  {
        first: T1;
        second: T2;
      };
    
      <T2, T3>(second: T2, third: T3):  {
        first: T1;
        second: T2;
        third: T3;
      };
    };
    
    function createApi<T1>(first: T1): api<T1> {
    
      function impl<T2>(second: T2): { first: T1; second: T2; };
      function impl<T2, T3>(second: T2, third: T3): { first: T1; second: T2; third: T3; };
      function impl<T2, T3>(second: T2, third?: T3): { first: T1; second: T2; third?: T3; } {
        if (third === undefined) {
          return { first, second };
        }
        return { first, second, third };
      }
    
      return impl;
    }
    
    const test = createApi<number>(1);
    console.log(test(2));
    console.log(test(2, 3));
    

    createApi 函数只返回一个内部重载函数。

    有关 TypeScript 重载的更多信息,请参阅the documentation 中的重载部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      相关资源
      最近更新 更多