Skip to content

Instantly share code, notes, and snippets.

@mildronize
Created September 8, 2024 03:30
Show Gist options
  • Save mildronize/8cebf7c7589984971c9d3b87fc3add8c to your computer and use it in GitHub Desktop.
Save mildronize/8cebf7c7589984971c9d3b87fc3add8c to your computer and use it in GitHub Desktop.
Type-safe Adapter Pattern in TypeScript
export interface PaymentAdapterBase {
pay(amount: number): void;
}
export class PayPalAdapter implements PaymentAdapterBase {
pay(amount: number): void {
console.log(`Pay amount ${amount}$ with PayPal`);
}
}
export class StripeAdapter implements PaymentAdapterBase {
pay(amount: number): void {
console.log(`Pay amount ${amount}$ with Stripe`);
}
}
class PaymentProcessor {
constructor(protected readonly payment: PaymentAdapterBase) { }
pay(amount: number) {
this.payment.pay(amount);
}
}
const payment = new PaymentProcessor(new PayPalAdapter());
payment.pay(100);
export interface PaymentAdapterBase {
paymentMethod: string;
pay(amount: number): void;
}
export class PayPalAdapter implements PaymentAdapterBase {
paymentMethod = 'PayPal';
pay(amount: number): void {
console.log(`Pay amount ${amount}$ with PayPal`);
}
}
export class StripeAdapter implements PaymentAdapterBase {
paymentMethod = 'Stripe';
pay(amount: number): void {
console.log(`Pay amount ${amount}$ with Stripe`);
}
}
class PaymentProcessor {
constructor(public readonly payment: PaymentAdapterBase) { }
pay(amount: number) {
this.payment.pay(amount);
}
}
const paymentProcessor = new PaymentProcessor(new PayPalAdapter());
paymentProcessor.pay(100);
const paymentMethod = paymentProcessor.payment.paymentMethod;
// ^?
export interface PaymentAdapterBase<TPaymentMethod extends string> {
paymentMethod: TPaymentMethod;
pay(amount: number): void;
}
export class PayPalAdapter implements PaymentAdapterBase<'PayPal'> {
readonly paymentMethod = 'PayPal';
pay(amount: number): void {
console.log(`Pay amount ${amount}$ with PayPal`);
}
}
export class StripeAdapter implements PaymentAdapterBase<'Stripe'> {
readonly paymentMethod = 'Stripe';
pay(amount: number): void {
console.log(`Pay amount ${amount}$ with Stripe`);
}
}
class PaymentProcessor<TPaymentMethod extends string> {
constructor(public readonly payment: PaymentAdapterBase<TPaymentMethod>) { }
pay(amount: number) {
this.payment.pay(amount);
}
}
const paymentProcessor = new PaymentProcessor(new StripeAdapter());
paymentProcessor.pay(100);
const paymentMethod = paymentProcessor.payment.paymentMethod;
// ^?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment