欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

基础讲解:TS中的泛型应用指南

最编程 2024-07-27 21:47:06
...
  • 泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
  • 设计泛型的关键目的是在成员之间提供有意义的约束,这些成员可以是:
1. 类的实例成员
2. 类的方法
3. 函数参数
4. 函数返回值

案例 1

  • 创造一个identity函数, 这个函数会返回任何传入它的 值
  • 不使用泛型(number版):
// 该函数对参数 arg 限制类型为 number,对返回值也限制类型为 number
function identity(arg: number): number {
    return arg;
}
console.log(identity(3)) // 3
console.log(identity("str")) // 报错
console.log(identity(null)) // 报错
  • 使用泛型(最终版):
// 我们使用类型变量T,它是一种特殊的变量,只用于表示类型而不是值。
function identity<T>(arg: T): T {
    return arg;
}
console.log(identity(3)) // 3
console.log(identity("str")) // "str"
console.log(identity(null)) // null
  • 结论:
1. 我们给identity添加了类型变量 <T>2. (arg: T)帮助我们捕获用户传入的类型(比如:number) 
3. 之后我们再次使用了 T 当做返回值类型。
4. 现在我们可以知道参数类型与返回值类型是相同的了。 这允许我们跟踪函数里使用的类型的信息。
5. 我们把这个版本的identity函数叫做泛型,因为它可以适用于多个类型。 
6. 不同于使用 any,它不会丢失信息,像第一个例子那像保持准确性,传入数值类型并返回数值类型。

使用泛型函数:

function identity<T>(arg: T): T {
    return arg;
}
// 第一种方法:传入所有的参数,包含类型参数
let output = identity<string>("myString");	// 输出类型为'string'

// 第二种方法:编译器会根据传入的参数自动地帮助我们确定T的类型(类型推论)
let output = identity("myString");	// 输出类型为'string'

案例 2

  • 首先,我们来实现一个函数 createArray,它可以创建一个指定长度的数组,同时将每一项都填充一个默认值:
// 使用数组泛型Array<any>来定义返回值的类型
// Array<any> 允许数组的每一项都为任意类型,并没有准确的定义返回值的类型
function createArray(length: number, value: any): Array<any> {
    let result = [];
    for (let i = 0; i < length; i++) {
        result[i] = value;
    }
    return result;
}

createArray(3, 'x'); // ['x', 'x', 'x']
  • 使用泛型使得数组中每一项都应该是输入的 value 的类型
// 在调用的时候,如果不指定它<T>具体的类型,也可以让类型推论自动推算出来:
function createArray<T>(length: number, value: T): Array<T> {
    let result: T[] = [];
    for (let i = 0; i < length; i++) {
        result[i] = value;
    }
    return result;
}

createArray<string>(3, 'x'); // ['x', 'x', 'x']