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...
但我想避免这种情况。
答案 0 :(得分:3)
是的,您可以使用重载声明来描述依赖于文字值的返回类型。您需要为first: 235426258
second: 32766
third: 0
fourth: 0
添加所有三个声明,因为实现签名不参与重载解析-如果没有第三个声明,具有非文字值的调用将无法编译。
createPassenger
更新,这是给出最后一行错误的完整示例:“类型为'boolean'的参数不能分配给类型为'true'的参数。”:
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);