工厂模式,类型“ IBaseDao”中缺少属性“ findByEmail”,但类型“ IUserDao”中必需

时间:2019-08-07 04:28:47

标签: typescript design-patterns

我正在尝试使用Factory Pattern创建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)

1 个答案:

答案 0 :(得分:0)

在编译时无法从运行时值(例如您的'daoName'字符串)推断类型-编译器不知道函数将返回哪种具体类型。

您将需要实现单独的方法来构造不同的对象类型(例如createUser(),createPost()),无论如何,这种方法都更加清晰易懂。