>[danger]用过ts吗,讲一下泛型? 泛型(Generics)是一种在 TypeScript 中用于增强代码复用性和类型安全性的特性。它允许我们在定义函数、类或接口时,使用参数化类型,这些参数化类型在使用时可以根据需要进行具体化。 使用泛型可以编写更通用、灵活的代码,使其能够适应多种类型的数据,而不仅限于特定的类型。通过在参数、返回值或变量声明中使用泛型类型参数,我们可以达到以下目标: 1. 提高代码的重用性:泛型使得函数、类或接口可以适应多种类型的数据,从而减少了代码的重复编写。 2. 增强类型安全性:通过在编译时对类型进行检查,避免在运行时发生类型错误。 下面是一些使用泛型的示例: **1. 泛型函数** ```typescript function identity<T>(arg: T): T { return arg; } // 使用泛型函数 let output = identity<string>('Hello World'); console.log(output); // 输出: Hello World // 类型推断 let output2 = identity('Hello TypeScript'); console.log(output2); // 输出: Hello TypeScript ``` 在上面的示例中,`identity` 是一个泛型函数,它接受一个类型参数 `T`,并将其应用于函数参数 `arg` 和返回值。通过传递具体的类型参数(如 `string`),我们可以指定函数参数和返回值的类型。同时,如果没有显式指定类型参数,TypeScript 会根据传入的参数自动推断出类型。 **2. 泛型类** ```typescript class Box<T> { private value: T; constructor(value: T) { this.value = value; } getValue(): T { return this.value; } } // 创建一个泛型类的实例 let stringBox = new Box<string>('Hello'); console.log(stringBox.getValue()); // 输出: Hello // 类型推断 let numberBox = new Box(42); console.log(numberBox.getValue()); // 输出: 42 ``` 在上面的示例中,`Box` 是一个泛型类。它接受一个类型参数 `T`,并将其应用于类的成员变量和方法的返回值。通过创建泛型类的实例时指定类型参数,我们可以限制实例的属性和方法的类型。同时,如果没有显式指定类型参数,TypeScript 会根据赋值给构造函数的参数自动推断出类型。 **3. 泛型接口** ```typescript interface Pair<T, U> { first: T; second: U; } // 使用泛型接口 let pair: Pair<number, string> = { first: 1, second: 'two' }; console.log(pair); // 输出: { first: 1, second: 'two' } ``` 在上面的示例中,`Pair` 是一个泛型接口。它接受两个类型参数 `T` 和 `U`,并定义了两个属性 `first` 和 `second`,对应不同的类型。通过声明变量时指定类型参数,我们可以使用泛型接口创建符合接口定义的对象。 通过泛型,我们可以编写更加灵活和可复用的代码,同时增强代码的类型安全性。在 TypeScript 中,泛型是非常有用的工具,可以以一种类型安全的方式处理不同类型的数据。