```ts
export function finalDoorState(events: string[]): string {
  const moves: Record<string, string> = {
    unlock: "closed",
    lock: "locked",
    open: "open",
    close: "closed",
  };
  let state = "locked";
  let ignored = 0;

  for (const event of events) {
    if (!moves.hasOwnProperty(event)) {
      throw new Error("Invalid event name");
    }
    if (moves[event] === state) {
      ignored++;
    } else {
      state = moves[event];
    }
  }

  return state + ":" + ignored;
}
```