TypeScript工厂类create方法如何根据入参返回对应类型实例
解决方案
要实现工厂方法根据入参自动推断返回类型,无需额外类型断言,可通过泛型绑定+类型映射的方式实现,修改代码如下:
步骤1:定义枚举与实例类型的映射关系
// 建立PRODUCTS枚举值到对应实例类型的映射表 type ProductTypeMap = { [PRODUCTS.MILK]: Milk, [PRODUCTS.SUGAR]: Sugar }
步骤2:改造ProductFactory类
class ProductFactory { // 泛型T捕获传入的枚举值,返回值直接绑定映射表中对应的实例类型 public static create<T extends PRODUCTS>(type: T): ProductTypeMap[T] { return new ProductFactory.products[type]() as ProductTypeMap[T]; } private static get products() { // 用as const锁定映射关系,避免类型被拓宽 return { [PRODUCTS.MILK]: Milk, [PRODUCTS.SUGAR]: Sugar, } as const; } }
效果验证
改造后调用create方法时,TypeScript会自动根据入参推断返回值类型,无需在调用侧写类型断言:
const milk = ProductFactory.create(PRODUCTS.MILK); // 自动推断milk为Milk类型,调用方法无报错 milk.getTankNumber(); const sugar = ProductFactory.create(PRODUCTS.SUGAR); // 自动推断sugar为Sugar类型,可正常调用自身和混入的方法 sugar.getNumberOfCubes(); sugar.getContents();
内容的提问来源于stack exchange,提问作者doox911
相关产品推荐
相关产品推荐

