打字稿:房产“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"
有什么我可以做些什么来解决这个问题?
答
要解决的打字稿错误,仍然可以得到预期的行为(不使用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()
使用ActiveRecord.tableName()将不会调用子类的重写方法,这将打破预期的行为@Joe –