TypeScript中的泛型

一、泛型函数

TypeScript泛型是一种可以使代码具有更高的可重用性和泛化能力的特性。通过泛型,我们可以定义一种通用的类型或函数,使其能够应对多种类型的输入。泛型在类、函数、接口等多种场景下都可以使用。

具体来说,在定义泛型函数时,我们可以使用来表示一个类型变量,这样我们就可以在函数中使用这个泛型类型来作为参数类型、返回值类型或变量类型等。例如:

function echo<T>(arg: T): T {
    return arg;
}

let myIdentity: <T>(arg: T) => T = echo;

在这个例子中,我们定义了一个echo函数,它使用泛型类型变量T作为输入参数类型和返回值类型,这样我们就可以使用不同类型的参数来调用该函数,例如:

console.log(echo('Hello TypeScript!')); // 输出:Hello TypeScript!
console.log(echo(123)); // 输出:123

此外,在定义类时,我们也可以使用泛型类型来增强其可扩展性和可复用性。例如:

class Queue<T> {
    private data: T[] = [];

    push(item: T) {
        this.data.push(item);
    }

    pop(): T | undefined {
        return this.data.shift();
    }
}

const queue = new Queue<number>();
queue.push(0);
queue.push(1);
queue.push(2);
console.log(queue.pop()); // 输出:0

const stringQueue = new Queue<string>();
stringQueue.push('Hello');
stringQueue.push('World');
console.log(stringQueue.pop()); // 输出:Hello

在这个例子中,我们定义了一个Queue类,并使用泛型类型变量T作为其元素类型。通过使用泛型,我们可以轻松地创建不同类型的Queue实例,以适应不同的场景。

总的来说,泛型能够帮助我们实现更加灵活、通用和高效的代码,减少重复代码的编写,提高代码的可维护性和复用性

二、泛型限制用法 extends {属性:类型}

TypeScript中的泛型限制用法 extends { 属性: 类型},是用来限制泛型类型T中必须包含指定属性并且属性类型为指定类型的用法,其中extends表示扩展类型。
例如:我这样定义一个 extends { length: number}类型约束,它要求泛型参数类型T必须具有一个名为length的属性且属性值是数字类型。

function printLength<T extends { length: number }>(arr: T): void {
  console.log(`Length: ${arr.length}`);
}

printLength('hello'); // Output: Length: 5
printLength([1, 2, 3]); // Output: Length: 3
printLength({ length: 10 }); // Output: Length: 10

printLength(123); // Error: Property 'length' is missing
printLength(true); // Error: Property 'length' is missing

上述代码中,我们定义了一个泛型函数printLength,它接受一个类型为T的参数,并打印出该参数的length属性值,因为使用了泛型限制,所以我们只能传递具有length属性的值给这个函数。例如,我们可以传递一个字符串、一个数组或者一个具有length属性的对象,但是传递其它类型的值会导致编译错误。

通过这种方式,TypeScript提供了一种强类型的限制机制,使得我们可以更加准确地表达代码的含义,并规避类型不匹配导致的运行时错误

三、使用泛型注意点

在编写泛型方法时,应该注意以下几点:

  1. 泛型形参的名称应该描述清楚其作用和范围,尽量不要使用单个字母的形参名称;
  2. 在使用泛型类型的属性或方法时,应该确保该属性或方法在所有可能的泛型类型中都是存在的,不要使用不存在的属性或方法;
  3. 在使用泛型类型的操作符时,应该考虑不同类型之间可能的差异性和兼容性问题,避免出现类型错误

你可能感兴趣的:(ts,typescript,javascript,前端)