Skip to content

TypeScript中的类

可选成员

class Calculator {
    precision?: number; // 可选的精度属性

    static maxOperand?: number; // 可选的静态最大操作数属性
    static minOperand: number; // 非可选静态属性

    // 可选的加法计算方法
    add?(x: number, y: number): number;

    // 可选的减法计算方法
    subtract?(x: number, y: number): number {
        return x - y;
    }

    // 可选的最大操作数获取静态方法
    static getMaxOperand?(): number;

    // 可选的最小操作数获取静态方法
    static getMinOperand?(): number {
        return this.minOperand;
    }
}

静态成员

// 计时器类
class Calculator {
    _precision: number = 2;
    static _maxOperand: number = 100;
    static _minOperand: number = -100;

    /**
     * 访问器,访问属性_precision
     */
    get precision(): number {
        console.log('获取属性_precision的值')
        return this._precision;
    }

    /**
     * 设置器,设置属性_precision
     */
    set precision(value: number) {
        console.log('设置属性_precision的值')
        this._precision = value;
    }

    /**
     * 静态读取器,访问静态属性_maxOperand
     */
    static get maxOperand(): number {
        console.log('读取静态属性_maxOperand的值')
        return Calculator._maxOperand;
    }

    /**
     * 静态设置器,设置静态属性_maxOperand
     */
    static set maxOperand(value: number) {
        console.log('设置静态属性_maxOperand的值')
        this._maxOperand = value; // this的是当前类,而非实例
    }

    /**
     * 静态读取器,访问静态属性_minOperand
     */
    static get minOperand(): number {
        console.log('读取静态属性_minOperand的值')
        return Calculator._minOperand;
    }

    /**
     * 静态设置器,设置静态属性_minOperand
     */
    static set minOperand(value: number) {
        console.log('设置静态属性_minOperand的值')
        this._minOperand = value; // this的是当前类,而非实例
    }

    /**
     * 构造计算器实例,不再接受操作数范围参数
     */
    constructor() {
    }

    /**
     * 重置操作数范围
     */
    static resetOperandRange(): void {
        Calculator._maxOperand = 100;
        this._minOperand = -100;
    }

    /**
     * 加法
     * @param x 加数 
     * @param y 加数
     */
    add(x: number, y: number): number {
        let areOperandsLegal: boolean = this.checkOperands(x, y);
        if (!areOperandsLegal) {
            throw '非法的操作数';
        }

        let fixed: string = (x + y).toFixed(this._precision); // 保留指定位数的小数
        return +fixed; // 将字符串转换成数字
    }

    /**
     * 减法
     * @param x 被减数
     * @param y 减数
     */
    subtract(x: number, y: number): number {
        let areOperandsLegal: boolean = this.checkOperands(x, y);
        if (!areOperandsLegal) {
            throw '非法的操作数';
        }

        let fixed: string = (x - y).toFixed(this._precision); // 保留指定位数的小数
        return +fixed; // 将字符串转换成数字
    }

    /**
     * 判断参与运算的两个操作数是否合法
     * @param x 操作数1
     * @param y 操作数2
     */
    checkOperands(x: number, y: number): boolean {
        if (x > Calculator.maxOperand || x < Calculator.minOperand) {
            console.log('操作数x超出了可计算数的范围');
            return false;
        }

        if (y > Calculator.maxOperand || y < Calculator.minOperand) {
            console.log('操作数y超出了可计算数的范围');
            return false;
        }

        return true;
    }
}

继承

class Car {
    color: string;
    run(): void {
        console.log(`${this.color}车在跑。。`);
    }

    beep(): string {
        return '嘟嘟';
    }
}

class SportsCar extends Car {
}

class SuperSportsCar extends SportsCar {
    nos: number; // 氮氧化物加速系统
    accelerate(): void {
        console.log(`加速1分钟,N2O剩余${--this.nos}千克。。`);
    }

    // 非法的重写:类型() => void不兼容于类型() => string
    // beep(): void {
    //     console.log('滴滴');
    // }

    beep(): string {
        return '滴滴';
    }
}

class ElectroCar extends Car {
    // 重写继承自父类的run()方法
    run(): void {
        super.run(); // 调用父类的run()方法
        console.log('我是烧电的。。');
    }
}

class Hovercar extends Car {
    constructor(color: string) {
        super(); // 调用父类的构造函数
        this.color = color;
    }
}

// 类型为Car的SportsCar实例
let superSportsCar: Car = new SuperSportsCar();
let beep = superSportsCar.beep(); // 获得“滴滴”
// superSportsCar.accelerate(); // 错误:汽车类Car未定义方法accelerate()
let _superSportsCar = superSportsCar as SuperSportsCar; // 类型断言
_superSportsCar.nos = 10;
_superSportsCar.accelerate(); // 输出“加速1分钟,N2O剩余9千克。。”

// 汽车质量检车函数
function checkCar(car: Car): boolean {
    try {
        car.beep();
        car.run();
        return true; // 车辆合格,返回true
    }
    catch {
        return false; // 车辆不合格,返回false
    }
}

// 检测超级跑车和电动汽车是否合格
let electroCar: ElectroCar = new ElectroCar();
let isSuperSportsCarQualified: boolean = checkCar(superSportsCar);
let isElectroCarQualified: boolean = checkCar(electroCar);

索引

// 使用下标访问背包对象的颜色属性
let knapsack = { color: 'orange', material: 'canvas', capacity: 10 };
let knapsackColor = knapsack['color']; // 得到“orange”

// 背包类
class Knapsack {
    [index: string]: string;
    material: string; // 包含索引的类可以封装属性
    // capacity: number; // 错误:属性的类型必须和索引值的类型一致
}

let knapsack1: Knapsack = new Knapsack();
knapsack1['color'] = 'orange'; // 向knapsack的索引中添加键为color值为orange的索引
let owner = knapsack1['owner']; // 获得到undefined,因为我们没有向knapsack1添加键为owner的索引项

// 索引键类型为number的背包类
class Packsack {
    [index: number]: string;
}

// 封装两个索引的帆布包类
class Rucksack {
    [index: string]: string;
    [index: number]: any;
}

访问性修饰符

class Calculator {
    protected readonly precision: number = 2;
    private static _maxOperand: number = 100;
    public static readonly minOperand: number = -100;

    // 读取私有属性_maxOperand的公共读取器
    static get maxOperand(): number {
        return this._maxOperand;
    }

    public constructor(precision: number) {
        this.precision = precision;
    }

    // 受保护的操作数检查方法
    protected checkOperands(x: number, y: number): boolean {
        if (x > Calculator.maxOperand || x < Calculator.minOperand) {
            console.log('操作数x超出了可计算数的范围');
            return false;
        }

        if (y > Calculator.maxOperand || y < Calculator.minOperand) {
            console.log('操作数y超出了可计算数的范围');
            return false;
        }

        return true;
    }
}

抽象类

abstract class Discount {
    // 折扣描述
    abstract description: string;

    /**
     * 折扣策略构造函数
     * @param totalAmount 总金额
     */
    constructor(protected totalAmount: number) {
    }

    // 获取折扣金额
    abstract getDiscountAmount(): number;
}

class NewbieDiscount extends Discount {
    description: string = '新用户一律5折';

    getDiscountAmount(): number {
        return this.totalAmount * 0.5;
    }
}

class RichDiscount extends Discount {
    description: string = '满额100打8折';

    getDiscountAmount(): number {
        return this.totalAmount < 100 ? this.totalAmount : this.totalAmount * 0.8;
    }
}