代码之家  ›  专栏  ›  技术社区  ›  Maryannah

创建允许设置类成员的类成员函数

  •  -1
  • Maryannah  · 技术社区  · 7 年前

    我想创建一个 set() 像这样工作

    set(key: string, value: any) {
      this[key] = value;
      return this;
    }
    

    这样我就可以连上电话了。

    我面临的问题是 key 参数可以接受任何值,而我希望它只接受我定义的类成员的值。

    例如:

    export class Person {
      public age: number;
      public name: string;
    
      // User can set 'age' or 'name', but can't set 'height'
      public set(key: string, value: any) {
        this[key] = value;
        return this;
      }
    }
    

    我知道我可以用这样一种类型:

    export type ofPerson = 'age' | 'name';
    

    但这意味着我要硬编码我班上的每一把钥匙。没关系 Person ,但我的实际班级有更多的成员…

    是否有方法键入参数以遵循所需的行为?

    2 回复  |  直到 7 年前
        1
  •  6
  •   Suren Srapyan    7 年前

    你需要 keyof 操作人员

    interface IPerson {
       age: number;
       name: string;
    }
    
    class Person implements IPerson {
    
       public age: number;
       public name: string;
    
       public set(key: keyof IPerson, value: any) {
         this[key] = value;
         return this;
       }
    }
    
    const person = new Person();
    person.set() // allows only properties defined in `IPerson`
    

    接口位于 Typescript Playground .

        2
  •  1
  •   ibenjelloun    7 年前

    另一种避免对键使用字符串的解决方案是使用对象作为值设置器:

    export class Person {
        name?: string;
        age?: number;
    
        set(values: Person): Person {
         return Object.assign(this, values);
        }
    }
    

    这样就可以用n个参数调用setter:

    person = person.set({age: 15});
    person = person.set({age: 45, name: 'SpongeBob'});
    

    如果要改变当前对象:

    export class Person {
        name ?  : string;
        age ?  : number;
    
        set(values: Person): Person {
            for (let key of Object.keys(values)) {
                this[key] = values[key];
            }
            return this;
        }
    }
    

    用途:

    person.set({age: 15});
    person.set({age: 45, name: 'SpongeBob'});
    
    推荐文章