联合型无铸型工厂

时间:2018-06-30 17:23:12

标签: typescript design-patterns factory

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...

但我想避免这种情况。

1 个答案:

答案 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);