【朝夕教育】《鸿蒙原生应用开发从零基础到多实战》004-TypeScript 中的泛型

标题详情
作者简介愚公搬代码
头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。
近期荣誉2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等。
博客内容.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
欢迎👍点赞、✍评论、⭐收藏

文章目录

  • 🚀前言
  • 🚀一、TypeScript 中的泛型
    • 🔎1.泛型基础概念
    • 🔎2.泛型使用场景
    • 🔎3.泛型变量与约束
    • 🔎4.泛型函数定义方式
    • 🔎5.泛型与集合
    • 🔎6.泛型接口
    • 🔎7.泛型类
    • 🔎8.多类型参数
    • 🔎9.关键注意事项


🚀前言

在现代开发中,泛型是一种重要的编程概念,能够极大地提升代码的灵活性和可重用性。TypeScript作为一种强大的编程语言,提供了对泛型的良好支持,让开发者能够以更安全和高效的方式处理各种数据类型。在鸿蒙原生应用开发中,掌握TypeScript中的泛型,不仅能优化代码结构,还能提升应用的性能和可维护性。

在本篇文章中,我们将详细介绍TypeScript中的泛型,包括泛型函数、泛型接口和泛型类等核心概念。通过丰富的实例,我们将展示如何在鸿蒙原生应用中灵活运用泛型,帮助你实现更高效的开发流程,减少代码冗余,提升项目的可读性和可扩展性。

🚀一、TypeScript 中的泛型

🔎1.泛型基础概念

定义:泛型(Generics)允许在定义函数、接口或类时不预先指定具体类型,而是在使用时动态指定类型,提升代码复用性和类型安全。

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

🔎2.泛型使用场景

  1. 兼容多类型需求
    避免为不同类型重复编写相同逻辑的函数:
    // 非泛型:需为不同类型单独实现
    function f(a: number): number[] { return [a]; }
    function f2(a: string): string[] { return [a]; }// 泛型:统一处理多种类型
    function f3<T>(a: T): T[] { return [a]; }
    f3<number>(1);  // 显式指定类型
    f3('hello');    // 类型推断自动推导为 string
    

🔎3.泛型变量与约束

  1. 类型变量 T
    表示任意类型,但需确保对 T 的操作合法:

    function getLength<T>(arg: T): number {return arg.length; // 错误:T 可能没有 length 属性
    }
    
  2. 泛型约束(extends
    限制 T 必须满足特定结构:

    interface HasLength {length: number;
    }
    function getLengthSafe<T extends HasLength>(arg: T): number {return arg.length; // 正确:T 必须包含 length 属性
    }
    getLengthSafe('abc'); // 3
    getLengthSafe(123);   // 错误:number 无 length
    

🔎4.泛型函数定义方式

  1. 函数声明

    function myFunc<T>(x: T): T { return x; }
    
  2. 函数表达式

    const myFunc = function<T>(x: T): T { return x; };
    
  3. 箭头函数

    const myFunc = <T>(x: T): T => x;
    // 注意:在 JSX 中需写成 <T, > 避免语法冲突
    

🔎5.泛型与集合

  1. 数组泛型
    明确数组元素类型:

    let arr: Array<number> = [1, 2, 3];
    
  2. 动态生成数组

    function createArray<T>(len: number, value: T): T[] {return Array(len).fill(value);
    }
    createArray<string>(3, 'x'); // ['x', 'x', 'x']
    

🔎6.泛型接口

  1. 泛型参数在接口方法中

    interface GenericInterface {<T>(arg: T): T;
    }
    const func: GenericInterface = (arg) => arg;
    
  2. 泛型参数在接口名中

    interface GenericInterface<T> {(arg: T): T;
    }
    const func: GenericInterface<string> = (arg) => arg;
    

🔎7.泛型类

在类定义时声明泛型,供实例属性和方法使用:

class GenericClass<T> {value: T;constructor(val: T) {this.value = val;}getValue(): T {return this.value;}
}
const numInstance = new GenericClass<number>(10);

🔎8.多类型参数

支持同时定义多个泛型类型:

function swap<T, U>(tuple: [T, U]): [U, T] {return [tuple[1], tuple[0]];
}
swap<number, string>([1, 'one']); // ['one', 1]

🔎9.关键注意事项

  1. 避免滥用 any
    泛型在保留类型信息的同时提供灵活性,优于 any
  2. 类型推断优先级
    多数情况下无需显式指定类型参数,编译器可自动推断。
  3. 约束与灵活性平衡
    通过 extends 确保类型安全,但过度约束可能限制泛型适用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/71350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

性能测试监控工具jmeter+grafana

1、什么是性能测试监控体系&#xff1f; 为什么要有监控体系&#xff1f; 原因&#xff1a; 1、项目-日益复杂&#xff08;内部除了代码外&#xff0c;还有中间件&#xff0c;数据库&#xff09; 2、一个系统&#xff0c;背后可能有多个软/硬件组合支撑&#xff0c;影响性能的因…

互联网时代如何保证数字足迹的安全,以防个人信息泄露?

用户在网络上所做的几乎所有事情&#xff0c;包括浏览、社交媒体活动、搜索查询、在线订阅&#xff0c;甚至购物&#xff0c;都会留下一条数据线索&#xff0c;这些数据可用于创建用户在线身份的详细档案。如果这些信息暴露&#xff0c;恶意行为者可能会利用它们将用户置于各种…

C# IEquatable<T> 使用详解

总目录 前言 在 C# 开发中&#xff0c;IEquatable<T> 是一个泛型接口&#xff0c;用于定义类型的相等性比较逻辑。通过实现 IEquatable<T>&#xff0c;可以为自定义类型提供高效的、类型安全的相等性比较方法。本文将详细介绍 IEquatable<T> 的使用方法、应…

web第四天

Dom操作元素 innerText、innerHTML、value(input and textarea用到) 更改属性&#xff0c;样式 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

LabVIEW基于IMAQ实现直线边缘检测

本程序基于 NI Vision Development 模块&#xff0c;通过 IMAQ Find Straight Edges 函数&#xff0c;在指定 ROI&#xff08;感兴趣区域&#xff09; 内检测多条直线边缘。用户可 动态调整检测参数 或 自定义ROI&#xff0c;实时观察识别效果&#xff0c;适用于 高精度视觉检测…

费曼学习法13 - 数据表格的魔法:Python Pandas DataFrame 详解 (Pandas 基础篇)

第二篇&#xff1a;数据表格的魔法&#xff1a;Python Pandas DataFrame 详解 (Pandas 基础篇) 开篇提问&#xff1a; 回忆一下&#xff0c;我们上一篇文章学习了 Pandas 的一维数据结构 Series&#xff0c;它可以看作是带 “标签” 的列表。 但现实世界中的数据&#xff0c;…

一周学会Flask3 Python Web开发-在模板中渲染WTForms表单视图函数里获取表单数据

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 为了能够在模板中渲染表单&#xff0c;我们需要把表单类实例传入模板。首先在视图函数里实例化表单类LoginForm&#xff0c;然…

小红书湖仓架构的跃迁之路

作者&#xff1a;李鹏霖(丁典)&#xff0c;小红书-研发工程师&#xff0c;StarRocks Contributor & Apache Impala Committer 本文整理自小红书工程师在 StarRocks 年度峰会上的分享&#xff0c;介绍了小红书自助分析平台中&#xff0c;StarRocks 与 Iceberg 结合后&#x…

数据结构第五节:排序

1.常见的排序算法 插入排序&#xff1a;直接插入排序、希尔排序 选择排序&#xff1a;直接选择排序、堆排序 交换排序&#xff1a;冒泡排序、快速排序 归并排序&#xff1a;归并排序 排序的接口实现&#xff1a; // 1. 直接插入排序 void InsertSort(int* a, int n); // 2. 希…

BambuStudio学习笔记:FaceDetector类

面检测器类解析 这段代码定义了一个名为 FaceDetector 的 C 类&#xff0c;用于处理三维模型中的面检测。以下是该类的具体说明&#xff1a; 头文件保护 #ifndef slic3r_FaceDetector_hpp_ #define slic3r_FaceDetector_hpp_这部分代码防止头文件被多次包含。 命名空间声明…

C++发展

目录 ​编辑C 的发展总结&#xff1a;​编辑 1. C 的早期发展&#xff08;1979-1985&#xff09; 2. C 标准化过程&#xff08;1985-1998&#xff09; 3. C 标准演化&#xff08;2003-2011&#xff09; 4. C11&#xff08;2011年&#xff09; 5. C14&#xff08;2014年&a…

LeetCode 21. 合并两个有序链表(Python)

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[] 示例 3&#xff1a; 输…

FPGA 配置原理

用户编程控制的FPGA 是通过加载比特位流配置内部的存储单元实现的。该存储单元就是所谓的配置单元&#xff0c;它必须在器件上电后进行配置&#xff0c;从而设置查找表&#xff08;LUT&#xff09;的属性、连线方式、IOB 电压标准和其它的用户设计。 1.配置帧 以Xilinx 公司的…

测试人员如何更好的跟踪BUG

软件测试中BUG跟踪是确保软件质量的关键环节。测试人员不仅需要发现BUG&#xff0c;还需有效管理其状态&#xff0c;从报告到修复验证的全过程。如何更好地跟踪BUG&#xff0c;成为测试人员提升效率的重要课题。本文将详细探讨测试人员可以采用的策略&#xff0c;包括使用工具、…

lamp平台介绍

一、lamp介绍 网站&#xff1a; 静态 动态 php语言 .php 作用&#xff1a;运行php语言编写动态网站应用 lamp Linux Apache MySQL PHP PHP是作为httpd的一个功能模块存在的 二、部署lamp平台 1、测试httpd是否可正常返回PHP的响应 2、测试PHP代码是否可正常连接数据…

2025年渗透测试面试题总结-字某跳动-渗透测试实习生(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 字某跳动-渗透测试实习生 渗透流程信息收集如何处理子域名爆破中的泛解析问题绕过CDN寻找真实IPPHPINFO页面关注…

Spring Boot 自动装配深度解析与实践指南

目录 引言&#xff1a;自动装配如何重塑Java应用开发&#xff1f; 一、自动装配核心机制 1.1 自动装配三大要素 1.2 自动装配流程 二、自定义自动配置实现 2.1 创建自动配置类 2.2 配置属性绑定 2.3 注册自动配置 三、条件注解深度应用 3.1 常用条件注解对比 3.2 自定…

《算法笔记》9.6小节 数据结构专题(2)并查集 问题 C: How Many Tables

题目描述 Today is Ignatius birthday. He invites a lot of friends. Now its dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, and all the friends do not want to stay with stra…

CPU、SOC、MPU、MCU--详细分析四者的区别

一、CPU 与SOC的区别 1.CPU 对于电脑&#xff0c;我们经常提到&#xff0c;处理器&#xff0c;内存&#xff0c;显卡&#xff0c;硬盘四大部分可以组成一个基本的电脑。其中的处理器——Central Processing Unit&#xff08;中央处理器&#xff09;。CPU是一台计算机的运算核…

Linux常用指令学习笔记

文章目录 前言一、文件和目录操作指令1. 文件操作2. 目录操作 二、文件权限管理三、网络相关指令四、系统管理指令五、文本编辑器基本操作 六、压缩和解压指令七、总结 前言 在当今的IT领域&#xff0c;Linux系统因其开源、稳定、安全等特性&#xff0c;广泛应用于服务器、个人…