TypeScript入门-泛型
在 TypeScript 中,泛型是一项非常强大的特性。它可以让我们在写代码的时候,不需要知道具体的类型,而是使用一个占位符来表示类型,在使用时再传入实际的类型,从而让代码更加灵活和可重用。
比如下面的例子,我们有一个 add 函数,它可以对数字和字符串进行加法运算:
function add(a: number, b: number): number {
return a + b;
}
console.log(add(1, 2)); // 输出 3
function addStr(a: string, b: string): string {
return a + b;
}
console.log(addStr('hello', 'world')); // 输出 'helloworld'
这样的代码看起来很简单,但是如果我们要对其他类型进行加法运算,比如数组和对象,就需要再写一个类似的函数。而使用泛型,我们可以让这个函数变得更加通用和灵活:
function add<T>(a: T, b: T): T {
return a + b;
}
console.log(add<number>(1, 2)); // 输出 3
console.log(add<string>('hello', 'world')); // 输出 'helloworld'
console.log(add<number[]>([1, 2], [3, 4])); // 输出 [1, 2, 3, 4]
console.log(add<object>({ name: 'Tom' }, { age: 18 })); // 输出 { name: 'Tom', age: 18 }
这里的 <T> 就表示使用泛型,它可以是任何类型。在调用函数时,我们可以传入具体的类型作为泛型参数,比如 <number>、<string>、<number[]> 等等。这样就可以让这个函数适用于各种类型,而且还可以让代码更加简洁和优美。
除了单一类型的泛型,还可以使用多个泛型参数来表示不同的类型。比如下面的例子,我们有一个 Pair 类,它可以表示一对值,可以是任何类型:
class Pair<T1, T2> {
constructor(public first: T1, public second: T2) {}
}
const pair1 = new Pair<number, string>(1, 'one');
console.log(pair1.first, pair1.second); // 输出 1, 'one'
const pair2 = new Pair<string, boolean>('hello', true);
console.log(pair2.first, pair2.second); // 输出 'hello', true
这里的 <T1, T2> 表示有两个泛型参数, 个表示 个值的类型,第二个表示第二个值的类型。在创建 Pair 对象时,我们可以传入具体的类型作为泛型参数,比如 <number, string> 或者 <string, boolean>。
值得注意的是,在使用泛型的时候,要注意类型兼容性,确保传入的类型满足函数的要求。比如,下面的代码是不能编译通过的:
console.log(add<number>(1, '2')); // 错误:类型 '"2"' 的参数不能赋给类型 'number' 的参数
这是因为 add 函数的泛型参数 T 要求是一个类型,而这里传入的是一个字符串,不符合要求。要想编译通过,就要保证传入的类型与函数要求的类型一致。
总结一下,泛型是一项非常重要和强大的特性,在 TypeScript 中被广泛使用。使用它可以让代码更加灵活和可重用,降低代码的重复度和维护成本。但要注意类型兼容性,在使用时确保传入的类型满足函数的要求。
