可以使用泛型来解决这个问题。你可以为 foo
函数添加一个泛型参数,用于表示元组中第二个条目的类型。然后,对于 args
参数,你可以将其声明为一个包含元组的数组,其中每个元组都具有相同的类型,但是第二个条目的类型可以根据元组而变化。
下面是使用泛型的示例代码:
function foo<T>(args: Array<[number, T]>) {
// Function implementation
}
foo([
[1, 3],
["hello", "world"],
[true, true],
[2, 7]
]); // No error
foo([
[1, 3],
["hello", 5], // Type error here
[true, true],
[2, 7n] // Type error here
]);
上述代码中,foo
函数的泛型参数 T
表示元组中第二个条目的类型。参数 args
声明为一个 Array<[number, T]>
类型,表示一个包含元组的数组,其中第一个条目的类型固定为 number
,第二个条目的类型可以根据泛型参数 T
的实际类型而变化。
对于附录部分的问题,你可以使用类似的方法,并在泛型参数 T
前添加另一个类型参数 SomeType
,用于表示第一个条目的类型。然后,你可以将 args
声明为一个包含元组的数组,其中每个元组都由 SomeType
和 T
组成。
以下是附录部分的示例代码:
function foo<SomeType, T>(args: Array<[SomeType, T]>) {
// Function implementation
}
foo([
[{value: 1}, 3],
[{value: "hello"}, 5], // Type error here
[{value: true}, true],
[{value: 2}, 7n] // Type error here
]);
上述代码中,foo
函数有两个类型参数 SomeType
和 T
,分别表示元组中第一个和第二个条目的类型。参数 args
声明为一个 Array<[SomeType, T]>
类型的数组,其中每个元组都由 SomeType
和 T
组成。