如何在TypeScript的同一类中引用静态变量?

时间:2018-10-16 12:10:28

标签: typescript

考虑以下代码:

class Foo {

    private static temp: Number;

    public static testIt() {
        this.temp = 0;// Var 1
        Foo.temp = 0;// Var 2
    }
}

编译此类时,我没有从TS中得到任何错误。这是否意味着两个变体都可以引用静态变量?

4 个答案:

答案 0 :(得分:3)

是的,尽管我不会使用第一个。

第一个起作用的原因是因为函数中的this设置为点运算符之前的任何值。那是

Foo.testIt()
^^^ <- this will be Foo

从某种意义上来说,您希望this是一个实例,但这种回旋方式令人困惑,但是这里没有实例。


总而言之,两者几乎总是相等的,但我仍然会在Foo上使用this

答案 1 :(得分:2)

是的,两个版本都引用静态方法中的静态字段。静态方法this内的对象是当前正在调用该方法的对象,该对象将是该类。

请注意,如果将静态方法分配给另一个变量,this将不再引用该类(因为该方法不会在该类上调用)。不管如何调用该方法,名为access的类都将起作用。

class Foo {

    private static temp: Number = 1;

    public static testIt() {
        console.log(this.temp)
        console.log(Foo.temp)
    }
}

Foo.testIt(); // Outputs 1, 1 

let m = Foo.testIt;
m(); // Outputs undefined, 1 

答案 2 :(得分:1)

TypeScript是一个超级集,用于验证您的代码类型在逻辑上是否一致(类型检查),它不验证您的代码是否是好的做法或它的用途。因此它将在此代码类型检查有效时进行编译。

那么这段代码是做什么的?

Foo.temp表示Foo类中的变量

this.temp表示Foo类实例中的变量。

答案 3 :(得分:1)

两种方法都是正确的

  • 运行Foo.testIt()将引用Foo
  • Foo.temp将查看名为Foo的变量(词法范围)的当前全局范围,并尝试将其属性temp更新为零

通过这种方式this指向另一个对象而不是Foo

Foo.testIt.call({}); => undefined , zero