只读属性只能在构造函数中分配,但在角结构中,不鼓励使用构造函数,有时也不可能使用构造函数进行某些初始化,而是使用角钩子ngOnInit。对于readonly属性,是否有任何方法将ngOnInit标记为构造函数,以便我可以将readonly用于本质上不可变的属性,这些属性在ngOnInit中只分配一次?
编辑:澄清:我不寻找声明只读属性的替代方法。我想按常规方式申报。我认为任何其他的东西在可读性上都是不值得的,仅仅是为了得到静态的检查。我本来希望有一些注释,就像tslint一样,可以忽略ngOnInit内部的不可变性。
从目前为止的答案来看,我想把它们分配为(this as any).foo = bar;是最接近我想要做的事情,尽管我认为它仍然比忽略只读更丑陋。
发布于 2019-03-01 09:53:32
不能将方法标记为构造函数,只是没有语法。您可以通过对readonly使用类型断言来破坏any,这只是一个编译时检查,并以一种不安全的类型访问任何您想要的公共/私有属性。还可以使用映射类型使类型可变,但它只适用于公共属性:
type Mutable<T> = { -readonly [ P in keyof T]: T[P] }
class Foo {
public readonly data: string;
private readonly pdata: string;
public init() {
const ref: Mutable<this> = this;
ref.data = ""
const pRef = this as any;
pRef.pdata = ""
const pSaferRef: { pdata: string } = this as any;
pSaferRef.pdata = ""
}
}发布于 2019-03-01 10:12:05
只读属性只能在构造函数中分配。
不真实
class MyClass {
readonly prop1 = 'prop1';
constructor(
public readonly prop2 = 'prop2'
) {
}
ngOnInit() {
Object.defineProperty(this, 'prop3', { wirtable: false, value: 'prop3'});
}
}正如您所看到的,已经有三种方法来定义它们。可能还有更多!
但是在角,它是不鼓励的,有时不可能使用构造函数进行某些初始化,而是使用角钩子ngOnInit。
对于新来的人来说,这是“不鼓励”的,因为告诉他们不要这么做更容易,而不是深入解释框架的生命周期。重点是,您可以随意使用构造函数,特别是对于与角度无关的内容(比如只读变量)。
是否有任何方法将ngOnInit标记为构造函数
建设者是构造者。不能将方法定义为构造函数。您只能在构造函数中调用一个方法,但这不会解决问题。
这样我就可以将readonly用于本质上不可变的属性,这些属性在ngOnInit中只分配了一次。
答案和底线:可以随意使用构造函数,。如果你想要的话,把你的只读属性放在里面。
另外,考虑提供一些沙箱或至少一些代码,这样我们就可以做出一个既适合您的代码又适合您的需要的答案。
发布于 2019-03-01 09:59:06
你为什么不用一个设置器和一个吸气器来代替readonly
export class MyComponent {
private _value: string;
set value(v: string) {
if (!this._value) {
this._value = v;
} else {
throw new TypeError('Assignment to read-only variable');
}
}
get value() {
return this._value;
}
}https://stackoverflow.com/questions/54941950
复制相似问题