【问题标题】:Add a JSON variable to typescript class with getter setter使用 getter setter 将 JSON 变量添加到 typescript 类
【发布时间】:2018-04-12 23:06:51
【问题描述】:

我有一个打字稿类,其中我有一些用于少数变量的 getter 和 setter 方法。示例:

export class TestService {
    private created: boolean;

        public getCreated(): boolean {
        return this.created;
    }

    public setCreated(created: boolean): void {
        this.created= created;
    }

}

我想在这个类中再添加一个变量,并为此添加一个 getter setter。然而,这个变量不是一个简单的字符串/布尔原语,而是需要某种 JSON,可以有自己的可以设置的属性(比如颜色、大小、形状),我不希望这 3 个属性有 3 个额外的变量使用它们相应的 getter setter 方法,但只有一个 JSON 可以包含 3 个不同的属性。最好的方法是什么?最好不必在此文件之外创建新类

【问题讨论】:

    标签: typescript


    【解决方案1】:

    JSON 是一种数据传输格式。

    阅读 TypeScript 接口,定义一个接口,然后将类型为该接口的字段添加到您的服务中。

    您应该避免在 TypeScript 中使用此类 getter 和 setter。这是一个 Java 习惯用法,但如果需要,TypeScript 可以为常规属性定义 getter 和 setter。

    你的服务应该减少到

    export interface Foo {
      bar: string;
      baz: number;
      wiz: boolean;
    }
    
    export class TestService {
      created: boolean;
      foo: Foo; 
    }
    

    如果稍后您意识到需要拦截对created 属性的每一次更改,那么您可以更改为以下代码,而无需对该服务的客户端代码进行任何更改:

    export class TestService {
      private _created: boolean;
      foo: Foo; 
    
      get created(): boolean {
        return this._created;
      }
    
      set created(c: boolean) {
        console.log('setting created...');
        this._created = c;
      }
    }
    

    【讨论】:

      【解决方案2】:

      您可以创建一个接口来匹配这些属性:

      interface Item {
        color: string;
        size: string;
        shape: string;
      }
      

      您是否在单独的文件中使用它取决于您,但您可以使用它:

      private item: Item;
      public getItem(): Item {
        return this.item;
      }
      public setItem(item: Item) {
        this.item = item;
      }
      

      你也可以做一个内联类型的对象字面量:

      private item: { color: string, size: string, name: string };
      

      但是,这更冗长且更容易出错,因为如果您在一个地方更新类型,您可能不得不在所有地方更新它。

      别说:如果你愿意,你可以使用TypeScript Accessors 作为getter/setter。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-05
        • 2015-02-28
        • 2019-06-10
        • 2017-02-26
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        • 2020-04-19
        相关资源
        最近更新 更多