如何用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
相关产品推荐
相关产品推荐

