Typescript派生类的静态属性返回undefined。这是一个错误或预期的行为?

时间:2017-03-13 17:47:28

标签: inheritance typescript static

我正在学习打字稿。我发现了一个奇怪的行为。静态属性有多个实例。在这种情况下,person类为2,student类为1。我用其他语言检查过,在c#中它是一个实例,与声明类共享,所有类派生自该类。

class person
{
    name : string 
    static maxAge : number
    constructor(name:string)
    {
        this.name = name
    }
}
class student extends person
{
    standard : string
    constructor(name:string,standard : string)
    {
        super(name);
        this.standard = standard;
    }
}
person.maxAge = 120;
console.log(person.maxAge);
console.log(student.maxAge);

我的问题是。

  1. 我想了解为什么静态属性不与派生类共享?
  2. 编译器是否遗漏了这些内容,并且无法提供任何编译错误?

2 个答案:

答案 0 :(得分:1)

  

我想了解为什么静态属性不与派生类共享?

在继承时共享 。而不是person.maxAge = 120;你应该:

class person
{
    name : string 
    static maxAge : number = 120
    constructor(name:string)
    {
        this.name = name
    }
}
class student extends person
{
    standard : string
    constructor(name:string,standard : string)
    {
        super(name);
        this.standard = standard;
    }
}
console.log(person.maxAge);
console.log(student.maxAge);
  

编译器是否遗漏了这些内容,并且无法提供任何编译错误?

没有。如果您说:

,编译器会信任您,就像它会信任您一样
let foo: number;
console.log(foo); // No error
foo = 123;

编译器不是通灵的(尽管TypeScript有时会感觉像这样)但是尽力防止错误

答案 1 :(得分:0)

  1. 它是共享的,但由于JavaScript是基于原型的,因此该属性通过原型链共享。在评估student.maxAge时,运行时将尝试从当前对象,然后是其原型,然后是原型的原型(链是通过继承创建)中查找,直到在{{1}中找到maxAge原型。
  2. enter image description here

    1. 您的代码段中没有任何TypeScript或JavaScript错误。