在TypeScript中,泛型是一种工具,它允许在定义函数、接口、或类的时候不具体指定它们将要操作的具体类型。这样,我们可以保持代码的灵活性和可重用性。
泛型的声明方式:
1. 泛型函数
泛型可以应用在函数上,例如,如果我们想编写一个函数,该函数可以接受数组,并返回数组中的第一个元素,我们可以这样写:
typescriptfunction getFirstElement<T>(arr: T[]): T { return arr[0]; } // 使用例子 let numbers = [1, 2, 3]; let firstNumber = getFirstElement(numbers); // 类型自动推断为 number let strings = ["apple", "banana"]; let firstString = getFirstElement(strings); // 类型自动推断为 string
在这个例子中,<T>
是一个泛型标记,表示该函数是泛型的。T
可以由调用函数时传入的参数自动推断其类型。
2. 泛型接口
泛型也可以定义在接口上,使得接口中的某些属性或方法可以支持多种类型:
typescriptinterface KeyValuePair<K, V> { key: K; value: V; } // 使用泛型接口 let item: KeyValuePair<number, string> = { key: 1, value: "Apple" };
在这个例子中,接口KeyValuePair
有两个类型变量K
和V
,分别代表键和值的类型。通过指定<number, string>
,我们创建了一个键为number
类型、值为string
类型的对象。
3. 泛型类
泛型同样可以应用于类,使类在处理不同数据类型时更加灵活:
typescriptclass Stack<T> { private elements: T[] = []; push(element: T) { this.elements.push(element); } pop(): T | undefined { return this.elements.pop(); } } // 使用泛型类 let numberStack = new Stack<number>(); numberStack.push(10); numberStack.push(20); console.log(numberStack.pop()); // 输出:20 let stringStack = new Stack<string>(); stringStack.push("Hello"); stringStack.push("World"); console.log(stringStack.pop()); // 输出:"World"
在这个例子中,Stack
类使用泛型T
来代表栈中存储的元素类型。这样,我们可以创建一个特定类型(如number
或string
)的栈。
通过使用泛型,我们的TypeScript代码变得更加灵活和可重用,同时还能保持类型的完整性和安全性。
2024年8月4日 22:53 回复