TypeScript Callable Instance | Cododel
CODODELDEV
EN / RU
Back to Deck
[utility]

TypeScript Callable Instance

ИСХОДНИК TypeScript
ВЕРСИЯ 1.0
АВТОР Cododel

TypeScript утилита, которая превращает экземпляр класса в вызываемую функцию с помощью Proxy. Позволяет вызывать экземпляр как функцию, сохраняя при этом доступ ко всем его свойствам и методам.

Применение

Идеально подходит для создания fluent API, где объект должен быть одновременно вызываемым и сохранять интерфейс класса:

class Calculator {
value: number = 0
call(x: number) {
this.value += x
return this
}
reset() {
this.value = 0
return this
}
}
const calc = toCallable(new Calculator())
calc(5)(10) // Вызываем через метод call()
console.log(calc.value) // Доступ к свойствам: 15
calc.reset() // Вызов методов

Возможности

  • Типобезопасность: Полная поддержка TypeScript с правильным выводом типов
  • Двойной интерфейс: Используется как функция или доступ к членам класса
  • Без накладных расходов: Минимальные затраты времени выполнения через Proxy
  • Чистый API: Прозрачная делегация к методу call()

Как это работает

  1. Создает Proxy вокруг привязанной функции
  2. Trap apply делегирует вызов методу call() экземпляра
  3. Trap get предоставляет доступ к свойствам/методам экземпляра
  4. Типы сохраняются через TypeScript generics

Исходный код

toCallable.ts

type hasCallMethod = { call: (...args: any[]) => any }
export default function toCallable<T extends hasCallMethod>(instance: T) {
type argsType = Parameters<T['call']>
const fn = (...args: argsType) => {
return instance.call(...args)
}
return new Proxy(fn.bind(instance), {
apply: (target, _thisArg, argsList: argsType) => target(...argsList),
get: (target, prop) => {
// Delegate to the class instance if the property exists there
if (prop in instance) {
return instance[prop as keyof T]
}
// Otherwise, look for it on the function
return target[prop as keyof typeof target]
},
})
}
[ ▲ 0 ]