Here is the code I came up with. It works great, and I hope it will help anyone that is struggling with this in the future.
const down = fromEvent(document, "keydown");
const up = fromEvent(document, "keyup");
const scannerKeys = up.pipe(
filter((e: KeyboardEvent) => e.code !== "ShiftLeft"),
withLatestFrom(down, (u: KeyboardEvent, d: KeyboardEvent) => ({
key: `${d.key}`,
pressTime: u.timeStamp - d.timeStamp,
e: u,
})),
filter((x) => x.pressTime < 5)
);
this.scanned = scannerKeys.pipe(
scan((acc, value) => {
return value.key !== "Enter" ? acc + value.key : "";
}, ""),
filter((x) => x !== ""),
debounceTime(50)
);
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…