Skip to content

Instantly share code, notes, and snippets.

@alaindet
Last active August 21, 2024 14:27
Show Gist options
  • Save alaindet/229470b0ecc17d090405371839d96fef to your computer and use it in GitHub Desktop.
Save alaindet/229470b0ecc17d090405371839d96fef to your computer and use it in GitHub Desktop.
Visitor Pattern in TypeScript
interface Visitor<TElementTypes = any> {
visit(element: TElementTypes): void;
}
interface ConcreteItem {
accept(visitor: Visitor): void;
}
class ConcreteItemA implements ConcreteItem {
accept(visitor: Visitor): void {
visitor.visit(this);
}
}
class ConcreteItemB implements ConcreteItem {
accept(visitor: Visitor): void {
visitor.visit(this);
}
}
type ConcreteItems = (
| ConcreteItemA
| ConcreteItemB
);
class ConcreteVisitor implements Visitor<ConcreteItems> {
visit(item: ConcreteItems): void {
switch (item.constructor) {
case ConcreteItemA:
return this.visitA(item);
case ConcreteItemB:
return this.visitB(item);
}
}
private visitA(item: ConcreteItemA): void {
return console.log('Visiting A...');
}
private visitB(item: ConcreteItemB): void {
return console.log('Visiting B...');
}
}
console.clear();
const a = new ConcreteItemA();
const b = new ConcreteItemB();
const visitor = new ConcreteVisitor();
visitor.visit(a);
visitor.visit(a);
visitor.visit(b);
visitor.visit(a);
visitor.visit(b);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment