美文网首页
TypeScript泛型

TypeScript泛型

作者: 杨志聪 | 来源:发表于2023-10-13 16:59 被阅读0次

泛型,可以帮助我们创建可复用的类、接口和函数:

// 泛型的类
class KeyValuePair<K, V> {
    constructor(public key: K, public value: V) {}
}

// 泛型的接口
interface Result<T> {
    data: T | null;
}

// 泛型的函数
function wrapInArray<T>(value: T) {
    return [value];
}

限制泛型

可以通过extends关键字限制泛型:

// 限制泛型只能是number或者string类型
function echo1<T extends number | string>(value: T) {}
// 限制泛型的形状
function echo2<T extends { name: string }>(value: T) {}
// 限制泛型的类(Person或者Person的子类)
function echo3<T extends Person>(value: T) {}

拓展泛型类

当我们拓展一个泛型类时,子类有两种选择:1. 使用泛型;2. 不使用泛型。

class Store<T> {}
// 子类使用泛型
class CompressableStore<T> extends Store<T> {}
// 子类不使用泛型
class SearchableStore extends Store<string> {}

子类除了可以使用泛型,还可以添加泛型限制:

// 子类限定泛型的形状
class ProductStore<T extends { name: string }> extends Store<T> {}

keyof操作符

keyof是一个特殊的操作符,用于获取对象类型的所有键(属性名)的联合类型。

interface Person {  
  name: string;  
  age: number;  
  address: string;  
}

type PersonKeys = keyof Person;  
// PersonKeys 类型为 "name" | "age" | "address"

keyof操作符在处理对象类型时非常有用。它可以让我们根据对象的键来动态访问对象的属性,而不必事先知道具体的键名。例如,可以使用keyof和索引签名来创建一个通用的getProperty函数,该函数接受一个对象和一个键名,并返回相应属性的值:

function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {  
  return obj[key];  
}

工具类型(Utility Types)

TypeScript 提供了一系列实用的工具类型,用于简化常见的类型操作。以下是 TypeScript 中一些常用的工具类型及其功能:

  1. Partial<T>: 将类型 T 的所有属性变为可选。它创建一个新的类型,其中原始类型 T 的所有属性都变为可选属性。
interface Person {  
  name: string;  
  age: number;  
}  
  
type PartialPerson = Partial<Person>;  
// 相当于  
// type PartialPerson = {  
//   name?: string;  
//   age?: number;  
// };
  1. Required<T>: 将类型 T 的所有属性变为必需。它创建一个新的类型,其中原始类型 T 的所有属性都变为必需属性。
interface Person {  
  name?: string;  
  age?: number;  
}  
  
type RequiredPerson = Required<Person>;  
// 相当于  
// type RequiredPerson = {  
//   name: string;  
//   age: number;  
// };
  1. Pick<T, K>: 从类型 T 中选择属性 K。它创建一个新的类型,其中只包含原始类型 T 中指定的属性 K。
interface Person {  
  name: string;  
  age: number;  
  address: string;  
}  
  
type PickPerson = Pick<Person, 'name' | 'age'>;  
// 相当于  
// type PickPerson = {  
//   name: string;  
//   age: number;  
// };
  1. Omit<T, K>: 从类型 T 中排除属性 K。它创建一个新的类型,其中不包含原始类型 T 中指定的属性 K。

  2. Record<K, T>: 创建一个类型,其属性键为 K,属性值为 T。它创建一个新的类型,其中属性键为 K,属性值为 T。

  3. Exclude<T, U>: 从类型 T 中排除与类型 U 相交的部分。它创建一个新的类型,其中从原始类型 T 中排除了与类型 U 相交的部分。

  4. Extract<T, U>: 从类型 T 中提取与类型 U 相交的部分。它创建一个新的类型,其中只包含原始类型 T 中与类型 U 相交的部分。

  5. NonNullable<T>: 从类型 T 中排除 null 和 undefined。它创建一个新的类型,其中从原始类型 T 中排除了 null 和 undefined。

  6. Readonly<T>: 将类型 T 的所有属性变为只读。它创建一个新的类型,其中原始类型 T 的所有属性都变为只读属性。

这些工具类型可以通过 TypeScript 的标准库直接使用,无需安装额外的包或模块。它们可以帮助简化复杂的类型操作,提高代码的可读性和可维护性。

相关文章

  • 2020-11-05Typescript(2.2)

    泛型 Generics---typeScript中最难的一部分 泛型 Generics---约束泛型 泛型 Gen...

  • TS 泛型+装饰器

    typescript 中的泛型 泛型的定义泛型函数泛型类泛型接口 泛型:软件工程中,我们不仅要创建一致的定义良好的...

  • bunny笔记|TS基础(2):泛型函数、泛型约束、在泛型约束中

    01 typescript的操纵类型 02 03 04 泛型约束 05 在泛型约束中使用类型参数 06 在泛型中使...

  • 03_TypeScript学习(三)

    一. TypeScript枚举类型 二. 枚举类型的值 三. 认识泛型 四. 泛型实现类型参数化 五. 泛型的基本...

  • TypeScript 学习笔记4 泛型

    1.泛型 1.1 泛型函数 1.2 泛型类 1.3 泛型接口 Typescript从0到1-学习视频教程-培训课程...

  • typescript

    title: typescript学习tags: typescript学习 [toc] 泛型 基本使用 两种使用方...

  • TypeScript 泛型

    泛型函数 使用 数组 类 泛型约束

  • TypeScript泛型

    有时候编程还要考虑它的复用性,很多时候不需要指定它的类型,或者同样的方法逻辑 但是入参和出差的类型不同。这个时候就...

  • TypeScript(泛型)

    泛型 软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同...

  • TypeScript -- 泛型

    1. 很多时候我们希望一个函数或者一个类可以支持多种数据类型,有很大的灵活性2.泛型:不预先确定的数据类型,具体的...

网友评论

      本文标题:TypeScript泛型

      本文链接:https://www.haomeiwen.com/subject/irwubdtx.html