typescript 实现 创建工厂。。

来源:互联网 发布:js jsonarray add 编辑:程序博客网 时间:2024/06/06 04:44
class Person implements ISay{    person() {        console.log('**** PERSON ****')    }    say() {        console.log("i'm a person");    }}class Dog implements ISay{    dog() {        console.log("**** DOG ****");    }    say() {        console.log("wang!wang!wang!");    }}class Cat implements ISay{    cat() {        console.log("**** CAT ****");    }    say() {        console.log("miao~~~~");    }}class Mouse implements ISay{    say() {        console.log("zhizhizhi....zhizhi..");    }}////////////////////////////////interface ISay{    say();}interface NoParamConstructor<T> {    new (): T;}class Say<T extends ISay> implements ISay {    instance_t: T;    constructor(ctor: NoParamConstructor<T>) {        this.instance_t = new ctor();    }    say() {        this.instance_t.say();    }}class PersonSay extends Say<Person>{    constructor() {        super(Person);    }}////////////////////////////////////////////////////function create<T>(t:T):Say<T> {        let typeName: string=t.name;    let codeStr: string="";    codeStr += "var "+typeName+"Say = (function (_super) {"    codeStr += "    __extends("+typeName+"Say, _super);"    codeStr += "    function "+typeName+"Say() {"    codeStr += "        return _super.call(this, "+typeName+") || this;"    codeStr += "    }"    codeStr += "    return "+typeName+"Say;"    codeStr += "}(Say));"        eval(codeStr);    let result = eval("new " + typeName + "Say()");    return result;    }let p = create(Person);p.say();p.instance_t.person();let d = create(Dog);d.say();d.instance_t.dog();let c = create(Cat);c.say();c.instance_t.cat();
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class Base {    hi() {        console.log("i'm Base");    }}class Sub extends Base {    hi() {        console.log("i'm Sub");    }}class Gen<T extends Base> {    constructor(private type) {    }    New() : T {        return new this.type();    }}function createNew<T extends Base>(t: T): T {     let typename: string = eval("t.name");    let result = eval("new Gen(" + typename + ").New()");    return result;}var test1 = new Gen<Base>(Base);test1.New().hi();var test2 = new Gen<Sub>(Sub);test2.New().hi();////////////////////////////////////////////////////////console.log("///////////////////");createNew(Base).hi();createNew(Sub).hi();

原创粉丝点击