面试题答案
一键面试TypeScript 接口在实现多态性方面的作用
- 定义规范:接口定义了对象的形状(shape),即对象应包含哪些属性和方法。在多态性实现中,接口为不同类型的对象提供了统一的契约。不同类只要实现了相同的接口,就可以在相同的上下文中被使用,从而表现出多态性。
- 类型检查:TypeScript 的静态类型检查机制通过接口确保实现类遵循特定的结构。这有助于在编译阶段发现类型不匹配问题,保证多态实现的正确性。
复杂业务场景下利用接口设计多态特性模块示例
假设我们正在开发一个电商系统,其中有不同类型的商品,如电子产品、服装等,每种商品都有不同的计算价格的逻辑。
- 定义接口:
// 定义商品接口
interface Product {
id: number;
name: string;
calculatePrice(): number;
}
- 实现具体商品类:
// 电子产品类
class ElectronicProduct implements Product {
id: number;
name: string;
constructor(id: number, name: string) {
this.id = id;
this.name = name;
}
calculatePrice(): number {
// 电子产品价格计算逻辑,例如基础价格加上 10% 的税
let basePrice = 100;
return basePrice * 1.1;
}
}
// 服装类
class ClothingProduct implements Product {
id: number;
name: string;
constructor(id: number, name: string) {
this.id = id;
this.name = name;
}
calculatePrice(): number {
// 服装价格计算逻辑,例如基础价格加上 5% 的运费
let basePrice = 50;
return basePrice * 1.05;
}
}
- 使用多态特性:
// 购物车类,接受一个 Product 数组并计算总价
class ShoppingCart {
products: Product[] = [];
addProduct(product: Product) {
this.products.push(product);
}
calculateTotalPrice(): number {
return this.products.reduce((total, product) => total + product.calculatePrice(), 0);
}
}
// 使用示例
let cart = new ShoppingCart();
let electronic = new ElectronicProduct(1, '手机');
let clothing = new ClothingProduct(2, 'T恤');
cart.addProduct(electronic);
cart.addProduct(clothing);
console.log(cart.calculateTotalPrice());
对代码可维护性和扩展性的影响
- 可维护性:
- 清晰的结构:接口明确了不同模块之间的交互方式,使得代码结构更加清晰。例如在上述电商系统中,通过
Product
接口,很容易理解不同商品类需要提供哪些功能,以及购物车如何与商品进行交互。 - 易于修改:当需要修改某个商品类的价格计算逻辑时,只要保持接口不变,不会影响到其他依赖该接口的模块,如购物车模块。这降低了修改代码带来的风险,提高了可维护性。
- 清晰的结构:接口明确了不同模块之间的交互方式,使得代码结构更加清晰。例如在上述电商系统中,通过
- 扩展性:
- 方便添加新类型:如果要添加新类型的商品,比如食品类,只需要创建一个实现
Product
接口的FoodProduct
类即可,无需修改购物车等现有模块的代码。这使得系统能够轻松应对业务需求的变化,具有良好的扩展性。 - 遵循开闭原则:通过接口实现多态性,符合开闭原则,即软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。在不修改现有代码的情况下,可以方便地扩展系统功能。
- 方便添加新类型:如果要添加新类型的商品,比如食品类,只需要创建一个实现