typescript - 无铸型联合式工厂
问题描述
abstract class Passenger {
passengerKey: string;
}
class PassengerAdult extends Passenger {
adultField: string;
}
class PassengerInfant extends Passenger {
infantField: string;
}
class PassengerFactory {
static createPassenger(isInfant: boolean): PassengerAdult | PassengerInfant {
if (isInfant) {
return new PassengerInfant();
}
return new PassengerAdult();
}
}
const passengerInfant: PassengerInfant = PassengerFactory.createPassenger(true);
我收到一个错误
输入'PassengerAdult | PassengerInfant' 不能分配给类型 'PassengerInfant'。“PassengerAdult”类型不能分配给“PassengerInfant”类型。“PassengerAdult”类型中缺少属性“infantField”。
我可以以某种方式强制打字稿理解他在createPassenger
方法内部返回的内容吗?我知道在调用行中我会像这样
const passengerInfant: PassengerInfant = <PassengerInfant>PassengengerFactory...
但我想避免这种情况。
解决方案
是的,您可以使用重载声明来描述取决于文字值的返回类型。您需要添加所有三个声明,createPassenger
因为实现签名不参与重载解析 - 如果没有第三个声明,具有非文字值的调用将无法编译。
class PassengerFactory {
static createPassenger(isInfant: false): PassengerAdult;
static createPassenger(isInfant: true): PassengerInfant;
static createPassenger(isInfant: boolean): PassengerAdult | PassengerInfant;
static createPassenger(isInfant: boolean): PassengerAdult | PassengerInfant {
if (isInfant) {
return new PassengerInfant();
}
return new PassengerAdult();
}
}
const passengerInfant: PassengerInfant = PassengerFactory.createPassenger(true);
const passengerRandom: Passenger = PassengerFactory.createPassenger(Math.random() > 0.5);
此处更新是给出最后一行错误的完整示例:“'boolean' 类型的参数不可分配给 'true' 类型的参数。”:
abstract class Passenger {
passengerKey: string;
}
class PassengerAdult extends Passenger {
adultField: string;
}
class PassengerInfant extends Passenger {
infantField: string;
}
class PassengerFactory {
static createPassenger(isInfact: false): PassengerAdult;
static createPassenger(isInfant: true): PassengerInfant;
static createPassenger(isInfant: boolean): PassengerAdult | PassengerInfant {
if (isInfant) {
return new PassengerInfant();
}
return new PassengerAdult();
}
}
const passengerInfant: PassengerInfant = PassengerFactory.createPassenger(true);
const passengerRandom: Passenger = PassengerFactory.createPassenger(Math.random() > 0.5);
推荐阅读
- android - 如何使用 MySql for android 创建登录活动
- javascript - 从键数组中设置对象/数组中的嵌套项
- firebase - 如何使用 firebase:shell 附加调试器 - firestore 云函数
- python - 姜戈;如何在浏览器的表单数据输出之间插入空格?
- c# - 依赖属性和通知子控件
- java - 查找给定时间范围内所有可能的时间组合
- jquery - 从另一个页面平滑滚动到#anchor
- php - 如何从php调用ajax
- googletest - Linux上的googletest项目结构
- docker - 如何在单独的 Docker 容器中在 Jenkins 中运行单元测试?