有什么理由在TypeScript中使用静态/私有静态方法?

时间:2018-09-24 14:09:08

标签: typescript oop

我正在考虑,但找不到任何理由在TypeScript类中使用静态方法(尤其是私有静态)。我在弄东西吗? 我问这个问题是因为我看到了这样的代码:

class Abc {

  public someMethod() {
     Abc.myMethod();
  }

  private static myMethod() {
     ...
  }
} 

P.S。。对于那些试图向我解释静态方法和非静态方法之间的区别以及什么是私有方法的人。由于我多年在C#中的背景,我非常了解这些。如果您仔细阅读了问题,那是关于在TypeScript中使用它们的问题。

3 个答案:

答案 0 :(得分:3)

您将在类中使用私有方法。不能从外部访问它。与Java等相同。对于私有静态相同。

静态表示您希望通过类名称访问该方法而不创建对象(实例化)。也可以从外部类访问它。没有静态,您需要创建一个对象。

class Abc {

  public someMethod() { 
     Abc.myMethod(); // Here you are able to access the static method myMethod because you are in the same class. It is not possible to access myMethod from another class directly. But someMethod() you can access directly which takes e.g. the data from myMethod();
  }

  private static myMethod() { // It is private and only accessible within the class and static therefore you can access it over the class name Abc.myMethod()
     ...
  }
} 

我希望对您有帮助

答案 1 :(得分:2)

静态方法/属性与非静态方法/属性之间的主要区别在于:在内存级别,将为静态字段创建一部分内存,该字段将在类中的所有对象之间共享。因此它可以在C#或Java中工作。

对于javascript,此行为已在ES6+中实现。但是对于早期版本的Ecma Scripts,打字稿会模拟这种情况。

在您的案例中,方法myMethod()可用作隐藏未绑定到类的特定实例并隐藏到最终用户的复杂资源密集型功能的方法。

查看此代码:

class A {
    protected _p: string;
    constructor() { 
        this._p = "A";
    }
    public someMethod(value: string) {
        A.myMethod(this._p + value);
    }
    private static myMethod(p:string) {
        console.log(p);
    }
} 

class B extends A {
    constructor() { 
        super();
        this._p = "B";
    }
}

var a1 = new A();
a1.someMethod("_1");
var a2 = new A();
a2.someMethod("_2");
var b1 = new B();
b1.someMethod("_1");

答案 2 :(得分:1)

我个人喜欢使用私有静态方法来表示pure function。然后,您绝对知道,这样的方法将永远不会改变对象的状态。

在面向对象的编程范式中尽可能实施函数式编程会产生更多的无副作用代码,最终具有较低的耦合度。这样导致代码不易出现对象状态错误,回归错误,并且通常更易于理解。

这是一个非常简单的示例:

interface DatabaseFoo {
    size: number;
    color: string;
}

class Foo {
    private static toDatabaseFoo(
        uid: string,
        color: number,
        length: number,
        width: number
    ): DatabaseFoo {
        let convertedData: DatabaseFoo;

        // Perform object specific data cleaning and/or transformations

        return convertedData;
    }

    private color: number;
    private length: number;
    private uid: string;
    private width: number;

    saveToPersistence(): void {
        const databaseFoo = Foo.toDatabaseFoo(
            this.uid,
            this.color,
            this.length,
            this.width
        );
        const jsonFoo = JSON.stringify(databaseFoo);

        // Save to persistence
    }
}