2

我有这样的东西;

测试库.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 建议在myValue上可用Test,但在运行时它不反映TestBase.myValue. IDE 是否错误地建议允许静态属性继承,或者 browserify/tsify 是否破坏了某些东西?

4

5 回答 5

0

在 Typescript 中,静态原语并没有像我期望的那样继承,但是静态对象是。我可以通过将值保存在对象中来解决这个问题;

测试库.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
    }
}
于 2016-04-28T03:49:44.793 回答
0

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

真的

虚假的,真实的

正如预期的那样。所以我猜你是正确的假设其他事情搞砸了,也许是browserify。

于 2016-03-23T07:12:38.967 回答
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.myValue是未定义的,当你构建一个对象时var test = new Test();。这恰好适用于 , 中的类TestBase更改constructorTestBase.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
    }
}
于 2016-03-23T08:27:31.933 回答
-1

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

于 2016-03-23T07:50:34.393 回答
-2

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

export class TestBase {
    static myValue: boolean;
    constructor() {
        this.myValue = true;
    }
}
于 2016-03-23T03:35:37.650 回答