首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只读属性与ngOnInit

只读属性与ngOnInit
EN

Stack Overflow用户
提问于 2019-03-01 09:47:27
回答 3查看 3.3K关注 0票数 7

只读属性只能在构造函数中分配,但在角结构中,不鼓励使用构造函数,有时也不可能使用构造函数进行某些初始化,而是使用角钩子ngOnInit。对于readonly属性,是否有任何方法将ngOnInit标记为构造函数,以便我可以将readonly用于本质上不可变的属性,这些属性在ngOnInit中只分配一次?

编辑:澄清:我不寻找声明只读属性的替代方法。我想按常规方式申报。我认为任何其他的东西在可读性上都是不值得的,仅仅是为了得到静态的检查。我本来希望有一些注释,就像tslint一样,可以忽略ngOnInit内部的不可变性。

从目前为止的答案来看,我想把它们分配为(this as any).foo = bar;是最接近我想要做的事情,尽管我认为它仍然比忽略只读更丑陋。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-01 09:53:32

不能将方法标记为构造函数,只是没有语法。您可以通过对readonly使用类型断言来破坏any,这只是一个编译时检查,并以一种不安全的类型访问任何您想要的公共/私有属性。还可以使用映射类型使类型可变,但它只适用于公共属性:

代码语言:javascript
复制
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 = ""
    }
}
票数 2
EN

Stack Overflow用户

发布于 2019-03-01 10:12:05

只读属性只能在构造函数中分配。

不真实

代码语言:javascript
复制
class MyClass {
  readonly prop1 = 'prop1';
  constructor(
    public readonly prop2 = 'prop2'
  ) {
  }

  ngOnInit() {
    Object.defineProperty(this, 'prop3', { wirtable: false, value: 'prop3'});
  }
}

正如您所看到的,已经有三种方法来定义它们。可能还有更多!

但是在角,它是不鼓励的,有时不可能使用构造函数进行某些初始化,而是使用角钩子ngOnInit。

对于新来的人来说,这是“不鼓励”的,因为告诉他们不要这么做更容易,而不是深入解释框架的生命周期。重点是,您可以随意使用构造函数,特别是对于与角度无关的内容(比如只读变量)。

是否有任何方法将ngOnInit标记为构造函数

建设者是构造者。不能将方法定义为构造函数。您只能在构造函数中调用一个方法,但这不会解决问题。

这样我就可以将readonly用于本质上不可变的属性,这些属性在ngOnInit中只分配了一次。

答案和底线:可以随意使用构造函数,。如果你想要的话,把你的只读属性放在里面。

另外,考虑提供一些沙箱或至少一些代码,这样我们就可以做出一个既适合您的代码又适合您的需要的答案。

票数 4
EN

Stack Overflow用户

发布于 2019-03-01 09:59:06

你为什么不用一个设置器和一个吸气器来代替readonly

代码语言:javascript
复制
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;
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54941950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档