【发布时间】:2021-10-27 06:33:38
【问题描述】:
如何将模块中的函数导出为类属性?
当类有一个属性指向模块内的一个函数时,该属性就像它的 private 一样,不管任何修饰符(在此处添加 public 不会做任何事情)
例如,这里有 3 种方法来定义属性(例如 a、b、c),它们都做同样的事情,但没有一种方法能满足我的需求——即在其他模块中定义函数等类身体不会失控
// myModule.ts
/** typedef this is a test */
export function func(msg) {
console.log(msg);
}
// myClass.ts
import * as myModule from './myModule';
export class MyClass {
a(msg) { return myModule.func(msg); }
b = (msg) => myModule.func(msg);
c = myModule.func;
}
// index.ts
import { myClass } from './myClass';
const classInstance = new myClass();
classInstance.a('test'); // works but this way i cannot get typedefs from a module
classInstance.b('test'); // added just for completness, but its same problem as c
classInstance.c('test'); // works but tsc complains about property 'c' does not exist on type 'MyClass'
【问题讨论】:
-
c = myModule.func;应该在这里工作。我将您的代码复制到 this sandbox 中,它似乎完全按照您的预期工作。当我将鼠标悬停在classInstance.c上时,我在 IDE 中看到文档注释就好了。我确实必须将myClass的大写修改为MyClass,但是,因为您发布的代码中不存在myClass。您能否发布一个显示问题的最小可重现示例? -
对不起大写的类型,否则就是这样 - 而你的沙箱正是我想要的。但是在我的环境中
classInstance.c()可以工作,但无法为其获取 IntelliType,当我手动键入它时,它会显示关于属性不存在的警告——比如它的私有属性。也许不同的 TSC 配置?顺便说一句,我正在使用 4.4 -
您可以尝试使您的
tsconfig.json与该沙箱中的相同,看看它是否表现得更好,然后尝试查看可能导致此问题的不同设置。还有一些 IDE 的缓存类型信息,需要偶尔重新启动以完全刷新应用程序类型。或者使用相同的设置启动一个空白且完全空的项目,看看您是否也有问题。 -
@AlexWayne 我在挖掘之后在下面添加了更多详细信息 - 找到了原因,但仍然不知道如何解决它,我还不能使用 esnext。跨度>
标签: javascript typescript