Хм, я думаю, что люди обычно хотят, чтобы подобные ошибки происходили , так как гетерогенные массивы встречаются реже, чем однородные массивы, и вывод типа, который всегда расширялся до тех пор, пока не работал, не улавливает реальных ошибок.
Если вы хотите обойти это, можно пойти в другом направлении: заставить вывод типа выполнить успешно, а затем вычислить значение T
из него, если вам это нужно:
async function merge<I extends Array<AnyIterable<any>>>(...iterables: I) {
for (const iterable of iterables) {
}
}
type UnArrayAnyIterable<A extends Array<AnyIterable<any>>> =
A extends Array<AnyIterable<infer T>> ? T : never;
Теперь это успешно:
merge([1, 2, 3], ['1', '2', '3']); // I inferred as the tuple `[number[], string[]]`
И если вы хотите T
, вы можете использовать UnArrayAnyIterable
:
declare function foo<I extends Array<AnyIterable<any>>>(...iterables: I): UnArrayAnyIterable<I>;
const ret = foo([1, 2, 3], ['1', '2', '3']); // string | number
Хорошо, надеюсь, это поможет.Удачи!