【发布时间】:2022-01-24 08:25:04
【问题描述】:
这是一个简单的函数,它接受一个 Iterable 的 Iterables。
function unwrapFirst<T extends Iterable<U>, U>(iter: Iterable<T>): U {
return [...[...iter][0]][0];
}
unwrapFirst([[1,2,3],[4,5,6]]);
我希望 TypeScript 能够正确地将 U 的类型推断为 number,但它会将其推断为 unknown。有人可以解释为什么吗?以及如何让 TypeScript 正确推断 U?
【问题讨论】:
-
很奇怪,
function unwrapFirst<U>(iter: Iterable<U>): U { return [...iter][0]; }; unwrapFirst([1,2,3]);确实被正确推断为function unwrapFirst<number>(iter: Iterable<number>): number,但function unwrapFirst<U, T extends Iterable<U>>(iter: T): U { return [...iter][0]; }; unwrapFirst([1,2,3]);没有,而是推断为function unwrapFirst<unknown, number[]>(iter: number[]): unknown。 -
性能说明:您应该使用
return iter[Symbol.iterator]().next().value[Symbol.iterator]().next().value;作为函数体,以避免为了获得第一个值而迭代整个嵌套序列。
标签: typescript multidimensional-array nested typescript-generics type-inference