我想创建一个具有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
没关系,但我的实际班级有更多的成员......
有没有办法输入参数来遵循想要的行为?
答案 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'});