我正在尝试编写一个生成器函数,它将连续返回可迭代中的先前值和当前值对。
function* prevCurrent<T>(iterable: Iterable<T>) {
let head = true
let previous: T
for (const current of iterable) {
if (head) {
previous = current
head = false
continue
}
yield [previous, current]
previous = current
}
}
使用方法如下:
const arr = [1, 2, 3]
for (const pair of prevCurrent(arr)) {
console.log(pair)
}
// [1, 2]
// [2, 3]
但是,在
yield
行,TypeScript 报告:
Variable 'previous' is used before being assigned.
显然静态分析无法识别
yield
只能在for-of
的第二次迭代中达到,并且previous
已经设置。
我可以使用
!
运算符轻松解决这个问题。但是是否有静态分析可以接受的替代语法或逻辑?
考虑自己创建迭代器:
function* prevCurrent<T>(iterable: Iterable<T>) {
const iterator = iterable[Symbol.iterator]();
const { value, done } = iterator.next();
if (done) return;
let previous: T = value;
for (const current of iterator) {
yield [previous, current]
previous = current
}
}