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

Static property inheritance not working as expected

我有这样的东西;

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 破坏了什么?

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

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

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

true

false, true

符合预期。所以我想你是正确的假设其他东西搞砸了事情,也许是 browserify。

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

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。

由此改变。

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.myValueTestBase.myValue是未定义的,当你建立一个对象时var test = new Test();。对于 constructorTestBase.myValue = true; 中的 class TestBase 更改,这恰好是正确的,但对于测试而言则不然,因为您静态访问 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
    }
}

在 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
    }
}