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

时间:2018-06-08 06:40:19

标签: typescript

我想创建一个具有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 个答案:

答案 0 :(得分:6)

您需要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中的界面示例。

答案 1 :(得分:1)

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

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'});