MST
星途 面试题库

面试题:TypeScript属性装饰器在复杂业务场景下的数据验证与默认值联动

在一个电商订单系统中,有一个订单类,包含订单金额、商品数量、折扣率等属性。要求使用TypeScript属性装饰器实现:1. 订单金额必须大于0;2. 商品数量必须为正整数;3. 折扣率必须在0到1之间。如果某个属性不满足条件,根据其他属性的值动态设置默认值。例如,若折扣率不满足条件,根据订单金额和商品数量重新计算一个合理的折扣率,并设置为默认值。请完整实现这个功能,并说明设计思路。
12.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 属性装饰器定义:使用TypeScript的属性装饰器来验证和设置订单类的属性。属性装饰器可以在类定义时对属性进行操作。
  2. 验证逻辑:对于每个属性,在装饰器中编写验证逻辑,确保其满足相应的条件。
  3. 默认值设置:当某个属性不满足条件时,根据其他属性计算并设置默认值。

代码实现

function validateOrderAmount(target: any, propertyKey: string) {
    let value: number;

    const getter = function () {
        return value;
    };

    const setter = function (newValue: number) {
        if (newValue <= 0) {
            // 根据其他属性计算默认值,这里简单设为100
            value = 100;
        } else {
            value = newValue;
        }
    };

    if (delete target[propertyKey]) {
        Object.defineProperty(target, propertyKey, {
            get: getter,
            set: setter,
            enumerable: true,
            configurable: true
        });
    }
}

function validateProductQuantity(target: any, propertyKey: string) {
    let value: number;

    const getter = function () {
        return value;
    };

    const setter = function (newValue: number) {
        if (newValue <= 0 || !Number.isInteger(newValue)) {
            // 根据其他属性计算默认值,这里简单设为1
            value = 1;
        } else {
            value = newValue;
        }
    };

    if (delete target[propertyKey]) {
        Object.defineProperty(target, propertyKey, {
            get: getter,
            set: setter,
            enumerable: true,
            configurable: true
        });
    }
}

function validateDiscountRate(target: any, propertyKey: string) {
    let value: number;

    const getter = function () {
        return value;
    };

    const setter = function (newValue: number) {
        if (newValue < 0 || newValue > 1) {
            // 根据订单金额和商品数量计算默认折扣率,这里简单设为0.9
            const orderAmount = target.orderAmount;
            const productQuantity = target.productQuantity;
            value = 0.9;
        } else {
            value = newValue;
        }
    };

    if (delete target[propertyKey]) {
        Object.defineProperty(target, propertyKey, {
            get: getter,
            set: setter,
            enumerable: true,
            configurable: true
        });
    }
}

class Order {
    @validateOrderAmount
    orderAmount: number;

    @validateProductQuantity
    productQuantity: number;

    @validateDiscountRate
    discountRate: number;

    constructor(orderAmount: number, productQuantity: number, discountRate: number) {
        this.orderAmount = orderAmount;
        this.productQuantity = productQuantity;
        this.discountRate = discountRate;
    }
}

// 测试
const order = new Order(-50, 0, 1.5);
console.log(`订单金额: ${order.orderAmount}`);
console.log(`商品数量: ${order.productQuantity}`);
console.log(`折扣率: ${order.discountRate}`);