我正在尝试使用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)
答案 0 :(得分:0)
在编译时无法从运行时值(例如您的'daoName'字符串)推断类型-编译器不知道函数将返回哪种具体类型。
您将需要实现单独的方法来构造不同的对象类型(例如createUser(),createPost()),无论如何,这种方法都更加清晰易懂。