打字稿:房产“propertyName的”不上键入“功能”

打字稿:房产“propertyName的”不上键入“功能”

问题描述:

打字稿编译器存在是给我在下面的代码示例虽然生成的JavaScript错误的https://www.typescriptlang.org/play/作品如预期打字稿:房产“propertyName的”不上键入“功能”

的错误是:错误TS2339 :属性'tableName'在类型'Function'上不存在。

class ActiveRecord { 
    static tableName(): string { // override this 
     return "active_record"; 
    } 

    static findOne(): any { 
     return 'Finding a record on table: ' + this.tableName(); 
    } 

    save(): void { 
     console.log('Saving record to table: ' + this.constructor.tableName()); 
    } 
} 

class MyModel extends ActiveRecord { 
    static tableName(): string { 
     return "my_model"; 
    } 
} 

let x = new MyModel(); 
x.save(); // "Saving record on table: my_model" 
console.log(MyModel.findOne()); // "Finding a record on table: my_model" 

有什么我可以做些什么来解决这个问题?

+0

使用ActiveRecord.tableName()将不会调用子类的重写方法,这将打破预期的行为@Joe –

要解决的打字稿错误,仍然可以得到预期的行为(不使用ActiveRecord.tableName()),就可以把构造到typeof运算的ActiveRecord

(this.constructor as typeof ActiveRecord).tableName()) 

参考链接: Access to static properties via this.constructor in typescript

替换此

this.constructor.tableName() 

有了这个

ActiveRecord.tableName() 

为静态函数必须使用类的命名空间中调用。

一种方法是不要在属性上使用static关键字。否则,使用ActiveRecord.tableName()