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();
class Person implements ISay{ person() { console.log('**** PERSON ****') } say() { console.log("i'm a person"); }}class Dog implements ISay{ dog() { conso