MST

星途 面试题库

面试题:TypeScript属性装饰器实现复杂默认值设置

假设有一个用户信息类,包含用户名、年龄、邮箱等属性。请用TypeScript属性装饰器实现,如果某个属性值未设置,则根据一定规则设置默认值。例如,年龄未设置时默认值为18,邮箱未设置时,根据用户名生成一个默认邮箱(格式为用户名 + @example.com)。
32.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
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);