静态 属性 继承未按预期工作
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 提示 myValue
在 Test
上可用,但在运行时它不反映 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.myValue
和TestBase.myValue
是未定义的,当你建立一个对象时var test = new Test();
。对于 constructor
、TestBase.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
}
}
我有这样的东西;
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 提示 myValue
在 Test
上可用,但在运行时它不反映 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.myValue
和TestBase.myValue
是未定义的,当你建立一个对象时var test = new Test();
。对于 constructor
、TestBase.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
}
}