typescript - 工厂模式,“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)
解决方案
不可能在编译时从运行时值(如您的 'daoName' 字符串)推断类型 - 编译器不知道函数将返回什么具体类型。
您需要实现不同的方法来构造不同的对象类型(例如 createUser()、createPost()),这无论如何都更清晰、更容易理解。
推荐阅读
- java - ISO_DATE_TIME.format() 到带有可选偏移量的 LocalDateTime
- android - Android 任务与活动 - 它们“真正”是什么?
- qt - QML ListView填充动画不起作用
- python - Django 迁移没有迁移 authtoken 和会话
- python - google Speech-to-Text api long_running_recognize 操作进度条
- java - 给定以下类,完成 Student 类的代码,以便在我们运行 Q01 类时打印以下输出
- javascript - Apostrophe CMS - afterInsert 被多次调用
- sql - 使用 Microsoft Access 合并多个表
- javascript - 在 React Native 应用程序中获取请求后,MobX 商店未更新
- parallel-processing - 包修改和分布式循环的问题