You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用TypeScript实现可直接调用且仅暴露自定义方法的类?

实现可直接调用且仅显示自定义方法的Logger

要实现既能像函数直接调用(logger("some text")),又支持点语法调用(logger.info("some text")),同时隐藏不必要的静态方法和内置函数属性,可按以下方式用TypeScript实现:

解决方案代码

// 定义Logger的方法接口,只包含需要暴露的自定义方法
interface LoggerMethods {
  info: (message: string) => void;
  warn: (message: string) => void;
  error: (message: string) => void;
}

// 定义Logger类型:兼具函数调用能力和自定义方法,同时排除Function内置属性
type Logger = ((message: string) => void) & LoggerMethods & {
  apply?: never;
  call?: never;
  bind?: never;
  prototype?: never;
};

// 实现核心调用逻辑
const logger: Logger = ((message: string) => {
  console.log(`[LOG] ${message}`);
}) as Logger;

// 挂载自定义方法
logger.info = (message: string) => {
  console.log(`[INFO] ${message}`);
};

logger.warn = (message: string) => {
  console.log(`[WARN] ${message}`);
};

logger.error = (message: string) => {
  console.log(`[ERROR] ${message}`);
};

// 使用示例
logger("直接调用的日志");
logger.info("info级别的日志");
logger.warn("warn级别的日志");
logger.error("error级别的日志");

关键说明

  • 类型约束:通过((message: string) => void) & LoggerMethods让logger同时具备函数调用能力和自定义方法;再通过& { apply?: never; ... }将apply、call等内置属性标记为never,IDE就不会提示这些无关方法。
  • 实现逻辑:先创建基础函数作为核心调用入口,再通过类型断言转为Logger类型,最后挂载自定义方法。这种方式不会产生多余的静态方法(比如之前的log),因为核心调用逻辑就是函数本身。
  • 提示控制:由于明确了Logger类型的成员范围,IDE只会提示info、warn、error这些自定义方法,不会显示内置函数属性或冗余方法。

内容的提问来源于stack exchange,提问作者Weelpert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:14:55