TypeScript笔记:类、泛型的使用实践记录
TypeScript 类
在TypeScript中,类是一种类型定义的方式,可以用来描述和约束对象的行为。类可以包含属性、方法和构造函数等。
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
sayHello() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
在上面的代码中,我们定义了一个Person类,它有两个属性name和age,一个构造函数constructor和一个小方法sayHello。构造函数用于初始化对象的属性,小方法则用于描述对象的行为。
TypeScript 泛型
泛型是TypeScript中的一个重要特性,它允许我们定义参数化的类型,也就是在类型中预留一些类型参数,这些参数在实例化时需要被具体类型所替代。
function identity<T>(arg: T): T {
return arg;
}
在上面的代码中,我们定义了一个泛型函数identity,它接受一个类型参数T,并返回一个类型为T的值。这个函数没有任何特殊的操作,只是返回输入的值,但是通过使用泛型,我们可以对输入和输出的类型进行更灵活的约束。
泛型的使用方法和场景
泛型的使用场景非常广泛,可以用于定义函数、类、接口等。下面是一些常见的使用方法和场景:
- 泛型函数:如上面提到的
identity函数,它对输入和输出的类型没有限制,可以是任意类型。 - 泛型接口:可以用于定义一些具有通用行为的对象,比如实现了某个接口的对象都可以进行某种操作。
- 泛型类:可以定义一些具有通用行为的类,比如实现了某个类的对象都可以进行某种操作。
- 类型约束:可以使用泛型来约束函数的输入和输出的类型,从而提高代码的灵活性和安全性。
下面是一些具体的例子:
- 泛型函数:
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
在上面的代码中,我们定义了一个泛型函数getProperty,它接受两个参数:一个类型为T的对象和一个类型为K extends keyof T的键。这个函数返回一个类型为T[K]的值,也就是给定键在对象中对应的值。通过使用泛型,我们可以对输入和输出的类型进行更灵活的约束。
- 泛型接口:
interface Listener<T> {
onEvent(data: T): void;
}
在上面的代码中,我们定义了一个泛型接口Listener,它包含一个类型为T的参数的onEvent方法。这个接口可以用于定义具有通用行为的对象,比如所有实现了这个接口的对象都可以接收任意类型的消息事件。
- 泛型类:
class Box<T> {
value: T;
constructor(value: T) {
this.value = value;
}
}
在上面的代码中,我们定义了一个泛型类Box,它接受一个类型参数T,并包含一个类型为T的属性。这个类可以用于定义具有通用行为的对象,比如所有实现了这个类的对象都可以存储任意类型的值。
4. 类型约束:
function createArray<T>(length: number, value: T): T[] {
const result: T[] = [];
for (let i = 0; i < length; i++) {
result[i] = value;
}
return result;
}