TypeScript中的泛型(泛型函数、接口、类、泛型约束)

这篇具有很好参考价值的文章主要介绍了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 Stack<T> {
    private items: T[] = [];

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

    pop(): T {
        return this.items.pop();
    }
}

let strStack = new Stack<string>();
strStack.push('apple');
strStack.push('banana');
strStack.push('cherry');

console.log(strStack.pop());
console.log(strStack.pop());
console.log(strStack.pop());

在上面的代码中,定义了一个Stack类,并声明了泛型类型T,用于在push和pop方法中进行类型的转换。通过传入不同类型的参数,可以得到不同类型的Stack实例。

三、泛型接口

interface Map<K, V> {
    set(key: K, val: V): void;
    get(key: K): V | undefined;
    has(key: K): boolean;
    clear(): void;
}

let numMap: Map<number, string> = {
    set(key: number, val: string) {
        // 添加键值对
    },
    get(key: number): string | undefined {
        // 获取键值对
    },
    has(key: number): boolean {
        // 判断是否存在
    },
    clear() {
        // 清空Map
    }
};

numMap.set(1, 'apple');
numMap.set(2, 'banana');

console.log(numMap.get(1));
console.log(numMap.get(2));

在上面的代码中,定义了一个Map接口,并使用泛型K和V来约束键和值的类型。通过传入不同类型的参数,可以得到不同类型的Map实例,并实现对不同类型键值对的操作。

四、泛型约束、泛型限制用法<T> extends {属性:类型}

在 TypeScript 中,泛型约束是一种让泛型类型参数只能取某些特定类型的值的机制。这个特定类型的限制可以是一个接口、类、枚举或其他类型。

例如,假设我们有一个泛型函数,它接受一个类型参数 T 和一个对象参数 obj,这个函数返回 obj 中的第一个 T 类型的属性值:

function getPropertyValue<T>(obj: object): T {
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      let value = obj[key];
      if (value instanceof T) {
        return value;
      }
    }
  }
  throw new Error(`No property of type ${T.name} found.`);
}

但是,这个函数可能会遇到一些问题。例如,如果我们调用 getPropertyValue({ a: ‘1’, b: 2, c: 3 }),那么会抛出一个错误,因为字符串 ‘1’ 不是一个 number 类型。

为了解决这个问题,我们可以使用泛型约束来限制 T 只能取某些特定类型的值。例如,我们可以要求 T 必须是实现了 Number 接口的类型:

interface Number {
  new (value?: any): number;
  (value?: any): number;
  readonly NaN: number;
  readonly MAX_VALUE: number;
  readonly MIN_VALUE: number;
  readonly NEGATIVE_INFINITY: number;
  readonly POSITIVE_INFINITY: number;
}

function getPropertyValue<T extends Number>(obj: object): T {
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      let value = obj[key];
      if (value instanceof T) {
        return value;
      }
    }
  }
  throw new Error(`No property of type ${T.name} found.`);
}

现在,如果我们调用 getPropertyValue({ a: ‘1’, b: 2, c: 3 }),就会得到一个类型错误,因为 ‘1’ 不是一个实现了 Number 接口的类型。但是,如果我们调用 getPropertyValue({ a: 1, b: 2, c: 3 }),就能得到正确的结果了。

另一泛型约束\<key extends keyof Type>

在 TypeScript 中,<key extends keyof Type> 是一种泛型约束方式,用于限制一个泛型类型参数 key 的范围。

其中,keyof 关键字可以用于获取一个类型 Type 的所有属性名,返回一个字符串字面量类型,例如:

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

type PersonKeys = keyof Person; // "name" | "age"

<key extends keyof Type> 中,extends 关键字表示限制 key 的取值只能是 Type 类型中已有的属性名。也就是说,只有 key 取值为 Type 类型中已有的属性名才符合类型约束,例如:

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

const person = {
  name: 'Bob',
  age: 25,
};
const name = getValueByKey(person, 'name'); // name 的类型是 string
const age = getValueByKey(person, 'age'); // age 的类型是 number
const gender = getValueByKey(person, 'gender'); // 编译报错,gender 不是 person 中的属性

在上面的例子中,getValueByKey 函数接收两个参数:一个泛型类型参数 T,代表输入对象的类型;一个泛型类型参数 K,代表属性名的类型。

extends keyof T 约束了类型参数 K 必须是输入对象类型 T 中已存在的属性名。因此,调用 getValueByKey 函数传入一个不存在的属性名 gender 会引发编译错误。

五、使用泛型注意点

在编写泛型方法时,应该注意以下几点:文章来源地址https://www.toymoban.com/news/detail-500994.html

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

到了这里,关于TypeScript中的泛型(泛型函数、接口、类、泛型约束)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kotlin中的泛型理解与应用

    泛型是一种在编程中用于增加代码的灵活性和重用性的概念。它允许我们编写可以在多种类型上工作的通用代码,而不需要为每种类型都编写不同的代码。 在Kotlin中,泛型可以应用于类、函数和接口等。下面是一些关于泛型在Kotlin中的理解和示例。 1、泛型类 泛型类是指可以

    2024年02月07日
    浏览(38)
  • python中的泛型使用TypeVar

    PEP484的作者希望借助typing模块引入类型提示,不改动语言的其它部分。通过精巧的元编程技术,让类支持[]运算不成问题。但是方括号内的T变量必须在某处定义,否则要大范围改动python解释器才能让泛型支持特殊的[]表示法。 鉴于此,我们增加了typing.TypeVar构造函数,把变量

    2024年02月04日
    浏览(50)
  • 详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)

    目录 一.什么是泛型 二.Java中为什么要使用泛型 三.泛型的语法 四.泛型类的使用 五.泛型的编译机制(擦除机制) 六.泛型的上界 泛型(Generics)是Java SE 5中引入的一个新特性,可以 使Java中的类和方法具有更广泛的类型范围 。通俗的说,它使得我们可以在定义类和方法时指定

    2024年02月05日
    浏览(48)
  • Java 中的泛型(两万字超全详解)

    博主将用 CSDN 记录 Java 后端开发学习之路上的经验,并将自己整理的编程经验和知识分享出来,希望能帮助到有需要的小伙伴。 博主也希望和一直在坚持努力学习的小伙伴们共勉!唯有努力钻研,多思考勤动手,方能在编程道路上行至所向。 由于博主技术知识有限,博文中

    2024年02月04日
    浏览(48)
  • Java 中的泛型是什么,它有什么作用?(十五)

    Java中的泛型是一种类型参数化机制,它使代码更具可读性、可重用性和稳健性。在Java中,通过使用泛型,可以将类型作为参数传递给类或方法,并在编译时执行类型检查,从而避免许多运行时错误。 泛型的基础 Java泛型的基础概念是类型变量、类型参数和类型边界。 类型变

    2024年02月03日
    浏览(38)
  • 【Rust 基础篇】Rust 中的泛型:结构体和方法

    在 Rust 中,泛型是一种强大的特性,可以在结构体和方法中使用通用的类型参数。通过泛型,我们可以编写更加灵活和可复用的代码。本篇博客将详细介绍如何在 Rust 的结构体和方法中使用泛型,包括泛型结构体的定义、泛型方法的实现以及对泛型参数的约束。 在 Rust 中,我

    2024年02月16日
    浏览(41)
  • 第8章-第1节-Java中的泛型(参数化类型)

    1、泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。什么是泛型?为什么要使用泛型? 2、概念:在类声明体中用到了类型参数。 3、泛型类只支持类类型,不支持基本数据类型(如int),但可以用包装类(如Integer ) 泛型标识 含义 T Type 类

    2024年01月23日
    浏览(44)
  • TypeScript 学习笔记 环境安装-类型注解-语法细节-类-接口-泛型

    JavaScript的变量类型相当于是动态类型,可以跟随着赋值的改变而类型改变,函数的参数也没有设定类型,所以在定位错误以及安全性上不太够。 说明 1.TS不能被JS解析器直接执行,需要编译成JS执行 2.即使TS编译出错也可以编译成JS 1.TypeScript是什么? TypeScript 是类型安全的Ja

    2024年02月16日
    浏览(74)
  • java的泛型【详解】

    定义类、接口、方法时,同时声明了一个或者多个类型变量(如:E) ,称为泛型类、泛型接口,泛型方法、它们统称为泛型。 作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常。 1.泛型类:

    2024年02月19日
    浏览(42)
  • Java的泛型详解

    Java泛型是一种编程语言的特性,它允许类、接口和方法在定义时使用一个或多个类型参数,这些类型参数在调用时会被实际类型替换,从而增强了代码的重用性和类型安全性。通过使用泛型,我们可以编写出更加通用的代码,同时也可以减少代码中的强制类型转换操作,提高

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包