有没有更好的方法将类参数传递给外部函数?

时间:2019-04-16 08:26:01

标签: node.js typescript

我创建了一个用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);
}

3 个答案:

答案 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