【问题标题】:How to use generics to type a zip function?如何使用泛型键入 zip 函数?
【发布时间】:2021-06-15 17:36:08
【问题描述】:

我想给这个 JS 函数添加类型:

function zip(array1, array2) {
  const length = Math.min(array1.length, array2.length);
  const result = [];
  for (let i = 0; i < length; i++) {
    result.push([array1[i], array2[i]]);
  }
  return result;
}

const res = zip(["1","2","3"], [4,5,6])

这是 res 的输出:

[["1",4],["2",5],["3",6]]

到目前为止,我能够创建以下sn-p,但这并不理想,因为结果类型不知道第一项是字符串,第二项是数字,它说它可以是任何一个其中:

function zip<T,U>(array1: T[], array2: U[]): (T|U)[][] {
  const length = Math.min(array1.length, array2.length);
  const result = [];
  for (let i = 0; i < length; i++) {
    result.push([array1[i], array2[i]]);
  }
  return result;
}

const res = zip(["1","2","3"], [4,5,6])

【问题讨论】:

    标签: typescript typescript-generics


    【解决方案1】:

    在 TypeScript 术语中,zip 基本上返回一个元组数组,可以输入如下:

    function zip<T,U>(array1: T[], array2: U[]): [ T, U ][] {
      const length = Math.min(array1.length, array2.length);
      const result: [ T, U ][] = [];
      for (let i = 0; i < length; i++) {
        result.push([array1[i], array2[i]]);
      }
      return result;
    }
    
    const res = zip(["1","2","3"], [4,5,6])
    

    这确保结果的每个条目都是一个数组,其中 T 在前,U 在后

    【讨论】:

      【解决方案2】:

      除了@apokryfos 的回答,您还可以考虑基于生成器的版本:

      function* zip<T,U>(array1: T[], array2: U[]): Generator<[T, U]> {
        const length = Math.min(array1.length, array2.length);
        for (let i = 0; i < length; i++) {
          yield [array1[i], array2[i]];
        }
      }
      
      const res = zip(["1","2","3"], [4,5,6])
      for (const [s, n] of res) {
        console.log(`${s} ${n}`);
      }
      

      【讨论】:

        猜你喜欢
        • 2020-11-27
        • 2019-08-02
        • 2021-11-17
        • 2019-07-19
        • 1970-01-01
        • 2020-02-27
        • 2022-01-25
        • 2020-01-20
        • 1970-01-01
        相关资源
        最近更新 更多