[TOC] ## 简介 一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件 缺点:无法最终变量类型 ``` function identity(arg: any): any { return arg; } ``` 泛型 ``` function identity<T>(arg: T): T { return arg; } ``` ## 传入泛型的两种方式 方式一:手动声明 `let output:string= identity<string>("myString"); ` 方式二: 类型推论[常用] `let output = identity("myString"); ` ## 泛型数组 ``` function loggingIdentity<T>(arg: T[]): T[] { console.log(arg.length); // Array has a .length, so no more error return arg; } ``` 或 ``` function loggingIdentity<T>(arg: Array<T>): Array<T> { console.log(arg.length); // Array has a .length, so no more error return arg; } ``` ## 泛型类 ``` class GenericNumber<T> { zeroValue: T; add: (x: T, y: T) => T; } let myGenericNumber = new GenericNumber<number>(); myGenericNumber.zeroValue = 0; myGenericNumber.add = function(x, y) { return x + y; }; ``` ## 泛型约束 ### 属性约束 如我们需要给某个泛型约束为必须有`length` 属性 ``` interface needLneght{ length:number } function demo<T extends needLneght>(arg:T):T{ console.log(arg.length); return arg } demo("abc");//ok demo(13);//error ``` ### 在泛型约束中使用类型参数