首页 > 解决方案 > 工厂模式,“IBaseDao”类型中缺少属性“findByEmail”,但在“IUserDao”类型中是必需的

问题描述

我正在尝试使用工厂模式来创建 DAO。这是我的代码:

interface IBaseDao {
  findOne(): Promise<any>;
}

abstract class BaseDao implements IBaseDao {
  public async findOne() {}
}

interface IUserDao extends IBaseDao {
  findByEmail(email: string): Promise<any>;
}

class UserDaoImpl extends BaseDao implements IUserDao {
  public async findByEmail(email: string) {}
}

interface IPostDao extends IBaseDao {
  findByTitle(title: string): Promise<any>;
}
class PostDaoImpl extends BaseDao implements IPostDao {
  public async findByTitle(title: string) {}
}

class DaoFactory {
  public static create(daoName: string): IBaseDao {
    switch (daoName) {
      case 'user':
        return new UserDaoImpl();
      case 'post':
        return new PostDaoImpl();
      default:
        throw new Error(`no DAO for daoName = ${daoName}`);
    }
  }
}


const userDao: IUserDao = DaoFactory.create('user');
userDao.findByEmail();

但是得到了这个错误:

“IBaseDao”类型中缺少属性“findByEmail”,但在“IUserDao”类型中是必需的。ts(2741)

标签: typescriptdesign-patterns

解决方案


不可能在编译时从运行时值(如您的 'daoName' 字符串)推断类型 - 编译器不知道函数将返回什么具体类型。

您需要实现不同的方法来构造不同的对象类型(例如 createUser()、createPost()),这无论如何都更清晰、更容易理解。


推荐阅读