/** * 泛型最大的作用: * (1):类型提示 * (2):类型约束 * */ //泛型可以附初始值 class Component

{ props: P; constructor(props?: P) { this.props = props; } } class Ball extends Component { } class GameObject { getElemntByQualifiedName(value: { new(): T }): T { return new value(); } } interface LengthWise { length: number; } interface Person { name: string; age: number; } interface EventType { click: { type: string, bubbles: boolean } mousedown: { type: string, bubbles: boolean }; mouseup: { type: string }; } interface EventTyp3 { addEventListener(type: T, handler: () => void): void; addEventListener(type: string, handler: () => void): void; } class BeeKeeper { hasMask: boolean; } class ZooKeeper { nametag: string; } class Animal { numLegs: number; } class Bee extends Animal { keeper: BeeKeeper; } class Lion extends Animal { keeper: ZooKeeper; } export class GenericsExample { execute() { let component = new Component({ a: 1, b: 2 }); let gameobject = new GameObject>(); let comp = gameobject.getElemntByQualifiedName(Component); //类型推断 let values = [1, 2, 3, 4, 5]; let finds = values.find((value, index, arr) => { return value > 3; }); console.log(finds); //泛型约束 typescript 1.8 //希望传入的数据有个length属性 this.genericsConstraint("1");//ok // this.genericsConstraint(1);//error this.genericsConstraint({ length: 100, width: 100 });//ok //约束key是对象obj的属性 let states = { width: 100, height: 100 }; //为了保证键值在有限范围内,需要通过 extends keyof 来处理 let propertyValue = this.getPropertyValue(states, "width"); console.log(propertyValue); type personKey = keyof Person; let key: personKey; switch (key) { case 'name': break; case "age": break; // case "location": //error // break; } this.addEventListener("mousedown", (evt) => { console.log(evt) }, this); //assign console.log(this.assign({ a: 1, b: 2, c: 3 }, { a: 10, c: 20 })); //-------------------泛型参数默认类型--TODO-------------------// class GameObject1{ } //因为有默认类型,这里不需要传入泛型类 let gameobject1 = new GameObject1(); x // class Component2 { // props: P; // constructor(props?: P) { // this.props = props; // } // } // class GameOBject2{ // } // let gameobject2 = new GameOBject2(); interface Person { name: string; age: number; location: string; } type P = keyof Person; let p: P; //等价于下面 let p1: "name" | "age" | "location"; type P2 = keyof Person[]; /** keyof 处理类型继承,类似交叉类型 */ class Sub { a: number; b: number; } class Parent extends Sub { c: number; } type b = keyof Parent; /**-----------------------泛型类型---------------------- */ function identity(arg: T): T { return arg; } let myIdentity: (arg: T) => T = identity; let myIdentity2: { (arg: T): T } = identity; interface GenericIdentityFn { (arg: T): T; } let myIdentify3: GenericIdentityFn = identity; myIdentify3(10); interface GenericIdentityFn2 { (arg: T): T; } let myIdentify4: GenericIdentityFn2 = identity; myIdentify4('10'); this.create(Parent); this.create2(Parent); this.createInstance(Bee); this.createInstance(Animal); // this.createInstance(BeeKeeper); //error } genericsConstraint(value: T): T { return value; } /** * 将源值的部分数据附给target */ assign(target: T, source: U): T { for (let id in source) { (target)[id] = source[id]; } return target; } /** 注册一个可选范围键值 */ addEventListener(type: K, listener: (evt?: EventType[K]) => void, thisObject: any): void { //logic } removeEventListener(type: K, listener: (evt?: EventType[K]) => void): void { } /** * typescript 2.1 * @param obj * @param key */ getPropertyValue(obj: T, key: K): T[K] { return obj[key]; } create(o: { new(): T }): T { return new o(); } create2(o: new () => T): T { return new o(); } createInstance(o: new () => T): T { return new o(); } }