泛型(Generics)是 TypeScript 中的一个重要特性,它允许在定义函数、类或接口时使用参数类型的占位符,从而增加代码的灵活性和复用性。
1. 泛型函数
泛型函数允许在函数定义时使用类型参数,这些类型参数可以在函数体内使用,从而使函数可以处理多种类型的数据:
function identity<T>(arg: T): T { return arg; } let output = identity<string>("hello"); // output 的类型为 string //<T> 表示这是一个泛型函数,T 是一个类型参数,可以在函数体内使用。函数 identity 接受一个参数 arg,并将它原封不动地返回。
2. 泛型类型
泛型类型允许在定义接口、类等类型时使用类型参数:
interface GenericIdentityFn<T> { (arg: T): T; } function identity<T>(arg: T): T { return arg; } let myIdentity: GenericIdentityFn<number> = identity; //GenericIdentityFn<T> 是一个泛型接口,定义了一个函数签名,该函数接受一个参数 arg,返回值类型与参数类型相同。然后,我们声明了一个类型为 GenericIdentityFn<number> 的变量 myIdentity,表示该变量是一个接受 number 类型参数的函数。
3. 泛型类
泛型类允许在类的实例成员或静态成员上使用类型参数:
typescript 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; }; //GenericNumber<T> 是一个泛型类,它有两个成员:zeroValue 和 add。我们创建了一个 GenericNumber<number> 类型的实例 myGenericNumber,并分别为它的 zeroValue 和 add 成员赋予了适当的值。
4. 泛型约束
泛型约束允许限制泛型类型的范围,使泛型类型必须符合特定条件:
interface Lengthwise { length: number; } function loggingIdentity<T extends Lengthwise>(arg: T): T { console.log(arg.length); // 我们知道这个参数有 .length 属性,所以没问题 return arg; }
//定义了一个泛型函数loggingIdentity <T>
,并使用了泛型约束extends Lengthwise
,表示泛型类型T
必须符合Lengthwise
接口的结构。这样,在函数内部就可以安全地访问arg
参数的length
属性。
5. 泛型与默认类型
在 TypeScript 中,可以为泛型参数指定默认类型:
function createArray<T = number>(length: number, value: T): T[] { let result: T[] = []; for (let i = 0; i < length; i++) { result.push(value); } return result; } let arr = createArray(3, 5); // arr 的类型为 number[] //reateArray<T = number> 中的 = number 表示 T 的默认类型为 number,如果调用函数时没有明确指定 T 的类型,则默认为 number。泛型是 TypeScript 中非常强大和灵活的特性,它可以帮助开发者编写更加通用和可复用的代码,提高代码的灵活性和可维护性。
标签:number,TS,类型,参数,arg,泛型,let From: https://www.cnblogs.com/qinlinkun/p/18138045