静态属性继承不按预期工作

时间:2016-03-23 02:58:51

标签: typescript browserify visual-studio-code tsify

我有类似的东西;

TestBase.ts

export class TestBase {
    static myValue: boolean;
    constructor() {
        TestBase.myValue = true;
    }
}

测试

import {TestBase} from './TestBase'

export class Test extends TestBase {
    constructor() {
        super();
    }
}

SomeOtherClass.ts

import {Test} from './Test';
import {TestBase} from './TestBase';

export class SomeOtherClass {
    constructor() {
        var test = new Test();
        console.log(Test.myValue); // undefined
        Test.myValue = false;
        console.log(Test.myValue, TestBase.myValue); // false, true
    }
}

我的IDE建议myValueTest可用,但在运行时它并不反映TestBase.myValue的值。 IDE是否错误地建议允许静态属性继承,或者是browserify / tsify是否破坏了什么?

5 个答案:

答案 0 :(得分:0)

我不认为它与打字稿有关,你的IDE是正确的。静态成员是继承的(link)。我已在node.js环境以及chrome浏览器中尝试过您的示例并输出

  

     

false,true

正如所料。所以我猜你是正确的,假设其他东西弄糟了,也许是浏览器化。

答案 1 :(得分:0)

class TestBase {
    static myValue: boolean;
    constructor() {
        TestBase.myValue = true;
    }
}

class Test extends TestBase {
    constructor() {
        super();
    }
}

class SomeOtherClass {
    constructor() {
        var test = new Test();
        console.log(Test.myValue); // undefined
        Test.myValue = false;
        console.log(Test.myValue, TestBase.myValue); // false, true
    }
}

class HelloWorld{
    public static main(){
        let some = new SomeOtherClass();
    }
}
HelloWorld.main();

我认为它是未定义的,因为只有在为该类调用构造函数时才初始化。

由此改变。

class TestBase {
        static myValue: boolean = true;
        constructor() {
            TestBase.myValue = true;
        }
    }
        console.log(Test.myValue); // true
        Test.myValue = false;
        console.log(Test.myValue, TestBase.myValue); // false, true

您可能已经知道,但您不需要构建一个对象来调用静态成员。

首次构建对象Test.myValue时,TestBase.myValuevar test = new Test();未定义。对于TestBaseconstructor中的TestBase.myValue = true;级更改,情况恰好如此,但不适用于Test,因为您静态访问Test.myValue或TestBase.myValue,TestBase.myValue创建要更改的对象但不在Test

之后

应用于原始代码:

class SomeOtherClass {
    constructor() {

        console.log(Test.myValue);     // undefined
        console.log(TestBase.myValue); // undefined

        var test = new Test();

        console.log(Test.myValue);     // undefined
        console.log(TestBase.myValue); // true
    }
}

答案 2 :(得分:0)

在Typescript中,静态基元不会以我期望的方式继承,但是静态对象是。我能够通过将值保存在对象中来解决该问题;

<强> TestBase.ts

export class TestBase {
    static someObject = { myValue: boolean };
    constructor() {
        TestBase.someObject.myValue = true;
    }
}

<强>测试

import {TestBase} from './TestBase'

export class Test extends TestBase {
    constructor() {
        super();
    }
}

<强> SomeOtherClass.ts

import {Test} from './Test';
import {TestBase} from './TestBase';

export class SomeOtherClass {
    constructor() {
        var test = new Test();
        console.log(Test.someObject.myValue); // true
        Test.myValue = false;
        console.log(Test.someObject.myValue, TestBase.someObject.myValue); // false, false
    }
}

答案 3 :(得分:-1)

尝试作为成员级实例的类级别属性将不起作用。我们需要声明为成员实例并初始化为成员实例而不是类对象

export class TestBase {
    static myValue: boolean;
    constructor() {
        this.myValue = true;
    }
}

答案 4 :(得分:-1)

您根本无法继承静态属性或方法。