【问题标题】:Typescript using generic type with rest operator使用带有休息运算符的泛型类型的打字稿
【发布时间】:2020-08-14 08:22:50
【问题描述】:

我有这个方法可以从 2 个数组中创建一对数组


function join<T, K> (arr1: T[], arr2: K[]): [T, K][]{
  const res = [];

  arr1.forEach(p => {
    arr2.forEach(n => {
      res.push([p, n])
    })
  })

  return [];
}

//I use it to create test data like this
// [["a",1], ["a", 2], ["b", 1], ["b", 2]]
join(["a", "b"], [1, 2]).forEach(([char, num]) => {
  it(`should do something with ${char} and ${num}`, () => {
    //assert here
  })
})

是否有一种简单的方法可以轻松地将 join 函数的功能概括为 2 个以上的参数并保持类型检查? 也许使用休息运算符...arr 和/或一些重载?

【问题讨论】:

  • 作为旁注,您的 join 函数实际上计算了两个数组的笛卡尔积。有时称为cross-product 或简称为cross

标签: typescript overloading


【解决方案1】:

我不确定我是否理解正确,但如果你的数组中只有字符串和数字,你可以这样做:

type customArray = (string | number)[];

const join = (args: customArray[]): void => {
   // ...
};

// Now you can pass any amount of arguments
join([['a', 1], ['b', 2], ['c, 3'], ['d', 4]]);

【讨论】:

    【解决方案2】:

    我认为可变元组可能会有所帮助:

    function join<T extends unknown[][]>(...args: T): T[] {
        const res = [];
    
        args[0].forEach(p => {
            args[1].forEach(n => {
                res.push([p, n])
            })
        })
    
        return res;
    }
    
    join2(["a", "b"], [1, 2], ["a, b"], [false, true]).forEach(([char, num, str, bool]) => {
    
    });
    

    您可以自己编写函数的主体,但 char、num、str 和 bool 变量的类型是正确的。

    【讨论】:

    • 它们离正确的类型不远,但它们是数组而不是实际类型 const res = join(["a", "b"], [1, 3]) res 的类型是 [string[], number[]][] 而不是 [string, number][]
    • 通过强制 res 变量上的类型你可以看到有一个错误see here
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2021-11-09
    • 2019-11-12
    • 2021-08-13
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多