function setDefaultValue<T>(defaultValue: T) {
return function (target: any, propertyKey: string) {
let value: T;
const getter = function () {
return value;
};
const setter = function (newValue: T) {
value = newValue === undefined ? defaultValue : newValue;
};
if (delete target[propertyKey]) {
Object.defineProperty(target, propertyKey, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});
}
};
}
class User {
@setDefaultValue('')
username: string;
@setDefaultValue(18)
age: number;
@setDefaultValue('')
email: string;
constructor(username: string) {
this.username = username;
if (!this.email) {
this.email = `${this.username}@example.com`;
}
}
}
// 测试
const user = new User('testUser');
console.log(user.username);
console.log(user.age);
console.log(user.email);