我创建了一个用typescript编写的nodejs模块,该模块可以正常工作,但是我对将类声明的参数传递给外部函数(在类范围之外声明的函数)的方法并不满意。是否有更好的方法可以做到,而不必将变量一一传递给“外部”函数?
我知道我可以将fooFunc函数移到该类中,但是我避免这样做,因为我不希望该函数可用于使用结果模块的代码(我只希望check()可用)到要导出的类。
export class Foo {
private readonly a: number;
constructor(a: number) {
this.a = a;
}
async check() {
fooFunc(this.a);
}
}
async function fooFunc(a: number) {
console.log(a);
}
答案 0 :(得分:1)
您可以.call
fooFunc
,这样this
中的fooFunc
引用foo
实例,因此无需将实例变量传递给{ {1}}:
fooFunc
(当然,这要求export class Foo {
readonly a: number;
constructor(a: number) {
this.a = a;
}
async check() {
fooFunc.call(this);
}
}
async function fooFunc(this: Foo) {
console.log(this.a);
}
不能是a
)
答案 1 :(得分:0)
您可以创建一个处理此行为的超类。这是我的解决方法
abstract class ParamCheck {
private readonly args: any[];
constructor(...args) {
this.args = args;
}
async check() {
fooFunc(this.args);
}
}
class Foo extends ParamCheck {
constructor(private a: number, private b: number) {
super(a, b);
}
}
async function fooFunc(...args) {
console.log(args);
}
new Foo(1, 2).check();
答案 2 :(得分:0)
作为替代,您可以考虑通过将fooFunc
的实现传递给构造函数来构成foo对象。 Something like this:
type CheckFunc = (n: number) => any;
export class Foo {
private readonly a: number;
private readonly checkFunc: CheckFunc;
constructor(a: number, checkFunc: CheckFunc) {
this.a = a;
this.checkFunc = checkFunc;
}
async check() {
this.checkFunc(this.a);
}
}
///////
async function fooFunc(a: number) {
console.log(a);
}
const foo = new Foo(1, fooFunc);
您可能要考虑此更改的原因是,现在可以安全地对该功能进行单元测试了。依靠对外部类的硬编码引用违反了Dependency Inversion Principal