this answer未讨论的一个解决方案是在派生类中实现一个get方法,该方法返回一个字符串文字(但不是成员属性,因为这基本上是同一个问题):
class Base {
constructor() { console.log( this.color ) }
public get color(): string { return 'blue' }
}
class Literal extends Base {
public get color(): string { return 'red' }
}
class Member extends Base {
private _color: string = 'green'
public get color(): string { return this._color }
}
let b = new Base() // => 'blue'
let l = new Literal() // => 'red'
let m = new Member() // => undefined
使用此方法是否存在任何问题/失败,例如效率,发布的JavaScript - 与链接答案中提供的解决方案相比?
答案 0 :(得分:0)
类字段的通常含义是它们在子类中提供了开销:
class Member extends Base {
protected _color: string = 'green'
public get color(): string { return this._color }
}
class Foo extends Member {
protected _color: string = 'orange'
}
_color
将被分配到'绿色'然后到橙色'在Foo
实例化。请注意,_color
应受到保护,以便重新分配。
这不是字符串值的一个大问题,但它存在,如果_color
是不需要为每个实例实例化的复杂对象,则可能会出现问题。
这可以通过将属性移动到类原型来解决:
interface Member extends Base {
_color: IComplexColor;
}
class Member extends Base {
public get color(): string { return this._color.toString() }
}
Member.prototype._color = new SomeComplexColorClass('green');
class Foo extends Member {}
Foo.prototype._color = new SomeComplexColorClass('orange');
请注意,在这种情况下,类声明应该与接口合并,这会导致_color
公开,因为没有初始化程序的protected _color;
会导致strictPropertyInitialization
编译器选项出现问题。这个解决方案并不适用于TypeScript,因为它需要使用变通方法来输入系统,但它会产生更清晰的输出。
对于具有字符串属性和相对较短的原型链的类,这可以被认为是初步优化。