如何在JavaScript文件中调用外部TypeScript脚本的私有method方法?
如何在JavaScript中调用TypeScript类的private方法
嘿,这个问题得拆成两种情况来聊,因为TypeScript里的“私有方法”其实有两种不同的实现逻辑,对应的JS调用方式也不一样:
情况1:你用的是TypeScript的private关键字
如果你的test.ts里的方法是这么写的:
class TestClass { private method() { // some operations } }
那你得知道:TypeScript的private只是编译阶段的语法限制,编译成JavaScript之后,这个方法并没有真正被私有化——它还是会作为实例(或原型)的常规属性存在。
在JS文件里,你可以这么调用:
// 先导入编译后的类(根据你的模块系统调整,这里用CommonJS举例) const { TestClass } = require('./test.js'); // 创建类的实例 const testInstance = new TestClass(); // 用方括号语法绕过TS的编译限制,直接调用方法 testInstance['method']();
这种方式本质是绕过了TS的检查,但在JS运行时是完全有效的,因为JS本身没有这种编译时的私有性限制。
情况2:你用的是ES6私有字段语法(#method)
如果你的test.ts里是用ES6的私有字段定义的方法:
class TestClass { private #method() { // some operations } }
那这种私有方法是JS运行时真正私有化的,JS引擎会把它彻底隐藏,你没办法从类外部直接访问到它。
唯一的解决办法是修改你的TypeScript代码,在类内部暴露一个公共方法来间接调用这个私有方法:
class TestClass { private #method() { // some operations } // 添加一个公共方法,用来内部调用私有方法 public invokePrivateMethod() { this.#method(); } }
编译后,在JS文件里调用这个公共方法就行:
const { TestClass } = require('./test.js'); const testInstance = new TestClass(); testInstance.invokePrivateMethod();
最后提个醒
虽然第一种情况可以绕过TS的私有限制,但这么做其实违背了TypeScript设计私有性的初衷——如果这个方法被标记为private,大概率是不希望外部直接调用的,所以除非万不得已,尽量不要这么干。
内容的提问来源于stack exchange,提问作者Tom Kole
相关产品推荐
相关产品推荐

