TypeScript 类、泛型的使用实践记录 | 青训营

前言

在现代前端开发中,TypeScript已经成为了一种广泛使用的编程语言。与JavaScript相比,TypeScript提供了更强大的静态类型检查和面向对象编程的特性。其中,泛型是TypeScript中一个非常重要且强大的特性,它可以让我们在编写代码时增加灵活性和安全性。本文将探讨TypeScript中泛型的使用方法和场景,以及如何使用类型约束来增加代码的灵活性和安全性。

TypeScript简介

TypeScript是一种由微软开发的开源编程语言,它是JavaScript的一个超集,可以编译成纯JavaScript代码。TypeScript添加了静态类型检查、面向对象编程和其他一些新特性,以提高JavaScript代码的可维护性和可读性。

TypeScript类的基本使用方法

TypeScript中的类(Class)是一种面向对象的编程方式,用于创建对象的蓝图。通过类,可以定义对象的属性和方法,并基于类创建具体的实例。

下面是一个简单的示例,展示了TypeScript中类的基本使用方法:

csharp 复制代码
class Animal {
  private name: string;
  
  constructor(name: string) {
    this.name = name;
  }
  
  public getName(): string {
    return this.name;
  }
  
  public makeSound(): void {
    console.log("The animal makes a sound.");
  }
}

class Dog extends Animal {
  public makeSound(): void {
    console.log("The dog barks.");
  }
}

// 创建Animal类的实例
const animal = new Animal("Lion");
console.log(animal.getName()); // 输出:Lion
animal.makeSound(); // 输出:The animal makes a sound.

// 创建Dog类的实例
const dog = new Dog("Samoyed");
console.log(dog.getName()); // 输出:Samoyed
dog.makeSound(); // 输出:The dog barks.

在上面的示例中,我们定义了一个名为Animal的基类和一个名为Dog的子类。

Animal类有一个私有属性name和一个构造函数,用于初始化name属性。它还有两个公共方法:getName()用于获取name属性的值,makeSound()用于输出动物的声音。

Dog类继承自Animal类,并重写了makeSound()方法。

通过创建Animal类的实例animal,并调用其方法和属性,我们可以看到输出结果。同样,创建Dog类的实例dog并调用其方法和属性也能得到相应的输出。

通过使用类和继承,我们可以构建出更复杂的对象和对象之间的关系。这种面向对象的设计方式可以提高代码的可扩展性和可重用性。

TypeScript类的基本使用方法

TypeScript的泛型(Generics)允许我们在定义函数、类或接口时使用参数化类型,以增加代码的灵活性和可重用性。通过泛型,我们可以在编写代码时不指定具体的类型,而在使用时动态地传入类型参数。

下面是泛型的基本使用方式和示例:

  • 声明泛型函数:
typescript 复制代码
function identity<T>(arg: T): T {
  return arg;
}

// 使用泛型函数
let result = identity<string>("Hello");
console.log(result); // 输出:Hello

// 或者省略类型参数,TypeScript会根据传入的参数类型自动推断
let result2 = identity("World");
console.log(result2); // 输出:World
  • 泛型类:
typescript 复制代码
class Queue<T> {
  private items: T[] = [];

  enqueue(item: T) {
    this.items.push(item);
  }

  dequeue(): T | undefined {
    return this.items.shift();
  }
}

let queue = new Queue<number>();
queue.enqueue(1);
queue.enqueue(2);
console.log(queue.dequeue()); // 输出:1
  • 泛型约束:
typescript 复制代码
interface Lengthwise {
  length: number;
}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
  console.log(arg.length);
  return arg;
}

loggingIdentity([1, 2, 3]); // 输出:3
loggingIdentity("Hello"); // 输出:5
相关推荐
淇逢春1 个月前
可被K整除的子数组问题 | 豆包MarsCode AI 刷题
青训营笔记
静水流深3972 个月前
03 模型IO| 豆包MarsCode AI刷题
青训营笔记
用户247841860022 个月前
第七次算法笔记 | 豆包MarsCode AI刷题
青训营笔记
幻62 个月前
小S的倒排索引 | 豆包MarsCode AI刷题
青训营笔记
用户826014428302 个月前
469. 环形数组最大子数组和问题
青训营笔记
用户605721920982 个月前
奇妙货币交易问题 | 豆包MarsCode AI刷题
青训营笔记
我明天再来学Web渗透2 个月前
“抖音互联网架构分析及高可用系统构建思考”(方向三)| 豆包MarsCode AI刷题
青训营笔记
用户302133066202 个月前
第三次刷题 | 豆包MarsCode AI刷题
青训营笔记
用户9105973027703 个月前
CSS详解| 豆包MarsCode AI刷题
青训营笔记
huyck3 个月前
伴学笔记1|豆包MarsCode AI 刷题
青训营笔记