gpt4 book ai didi

类中的 Typescript::namespacing 函数?

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:45 25 4
gpt4 key购买 nike

假设一个像这样的简单类:

class Simple {
private _transactions: [];
makeTransaction() { ... }
revertTransaction() { ... }
// some other methods as well...
}

let obj = new Simple();
obj.makeTransaction(...);
obj.makeTransaction(...);
obj.revertTransaction(...);

现在,我想公开一些与报告相关的更多方法,我想将它们分组如下:

obj.reports.allTransactions();
obj.reports.reveretedTransactions();
obj.reports.clearedTransactions();

这些方法将使用 Simple 类本身中的私有(private)变量来返回一些报告。

我使用了以下方法来实现这一点:

class Simple {
private _test = () => { return this._transaction }
reports = {
getAll: this._test
}
}

这是可行的,但它有几个缺点:

  1. 它迫使我将所有必需的函数声明为类本身的一部分,然后再次在 reports 对象中引用它们。
  2. Typescript 向我显示 obj.reports.getAll 是一个属性,尽管我也可以将它作为函数调用。尽管如此,我还是没有得到正确的函数签名提示。
  3. 它迫使我不必要地使用箭头函数(闭包)。

有没有更好的方法来做同样的事情?

最佳答案

您可以为reports 对象创建一个类:

class Reports {
private _transactions: any[];

constructor(transactions: any[]) {
this._transactions = transactions;
}

getAll() {
return this._transactions;
}
}

class Simple {
private _transactions: any[];
public reports: Reports;

constructor() {
this._transactions = [];
this.reports = new Reports(this._transactions);
}

makeTransaction() {}
revertTransaction() { }
}

( code in playground )


编辑

您还可以将reports 公开为一种类型:

interface Reports {
getAll(): any[];
}

class Simple {
private _transactions: any[];
public reports: Reports;

constructor() {
this._transactions = [];
this.reports = {
getAll: () => {
return this._transactions;
}
}
}

makeTransaction() {}
revertTransaction() { }
}

( code in playground )


第二次编辑

另一种选择是将报告分离到不同的类中,但将 Simple 实例作为其成员,并将该实例的所有成员公开。
如果您随后将 Simple 变成一个接口(interface),您可以隐藏那些公共(public)成员:

class Reports {
private _simple: SimpleImpl;

constructor(simple: SimpleImpl) {
this._simple = simple;
}

getAll() {
return this._simple.transactions;
}
}

interface Simple {
makeTransaction();
revertTransaction();
}

class SimpleImpl implements Simple {
public transactions: any[];
public reports: Reports;

constructor() {
this.transactions = [];
this.reports = new Reports(this);
}

makeTransaction() {}
revertTransaction() {}
}

( code in playground )

如果只公开Reports 类和Simple 接口(interface),则公共(public)成员仅对Reports 的实例可见。

关于类中的 Typescript::namespacing 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40770751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com