Typescript高级: 基于泛型T的函数重载来实现各个类型数据的排序

Flow泛型函数实战:解决类型失焦与memoize类型守恒问题 泛型函数是静态类型系统的核心能力,它通过类型参数抽象实现函数签名的复用性与安全性。在Flow中,泛型并非简单语法糖,而是基于约束驱动(而非TS的推导优先)的类型契约机制,直接影响type checks的可靠性与运行时行为的一致性。其技术价值在于消除any滥用、预防类型擦除、保障API响应与缓存结果的类型守恒。典型应用场景包括泛型API请求封装、React Hooks类型化、以及与memoize等高阶函数深度集成——尤其在客户端缓存场景下,泛型约束直接决定缓存key生成逻辑与返回值类型的严格对齐。本文聚焦Fl 阅读详情

概述

  • 现在我们来实现一个场景,基于泛型来写排序的工具类
  • 这个工具类实现对各种类型的数据进行排序
  • 目前排序算法选择的是快排

代码实现

// 基于快排,实现一个排序的函数
function quickSort<T>(arr: Array<T>): T[] {
    if (arr.length < 2) { return arr }
    const left: Array<T> = [];
    const right: Array<T> = [];
    const mid = arr.splice(Math.floor(arr.length / 2), 1)[0];
    for (var i = 0; i < arr.length; i++) {
      arr[i] < mid ? left.push(arr[i]) : right.push(arr[i])
    }
    return quickSort(left).concat(mid, quickSort(right))
}

//  对中文进行排序
function sortChinese<T>(arr: Array<T>): T[] {
    return arr.sort(function (firstnum, secondnum) {
      return (firstnum as any).localeCompare(secondnum, "zh-CN")
    })
}

// 中文+英文、数字数组排序混合方法, 分工明确
function sort(data: string, count?: number): string // [可有可无]
function sort<T>(data: T, count?: number): T // 分工明确
function sort(data: any, count: number = 5): any {
    if (typeof data === "string") {
        // 如果是字符串
        return strSelfSort(data, count)// 按照字符串自排序
    }
    if (data instanceof Array) {
        // 如果data是数组
        if (isChinese(data)) {//如果是中文数组
            return sortChinese(data);
        }
        const newArr = data.map((item) => {
            return typeof item === "string" ? strSelfSort(item) : item
        })
        // 英文、数字数组排序
        return quickSort(newArr as any);
    }
}

// 工具函数 ---- 判断数组中是否有中文元素
function isChinese<T>(arr: Array<T>): boolean {
    const reg = /[\u4e00-\u9fa5]+/g;
    return arr.some((item) => {
        return reg.test(item as any)
    })
}

// 工具函数 ---- 字符串自排序
function strSelfSort(str: string, count: number = 5): string {
    // (1) 字符串拆分成数组
    const strArray = str.split('');
    // (2) 数组进行使用快速排序算法来排序
    const strSortArray = quickSort(strArray);
    // (3) 重新把排好序的数组连接成一个字符串返回
    const strResult = strSortArray.join('');
    return strResult.length > 10 ? strResult.substring(0, count) + "..." : strResult;
}

// ------ 通用数组 -------
const numArr = [3, 1.883332, 8, 9, 20, 15, 2, 7, 13, 11, 19, 18, 5, 6, 17, 4];

// ------ 测试字符串 -------
function test1() {
  const str = "bdfaerafdfsd"
  const strResult = sort(str, 10)
  console.log("长度为:", strResult.length)
  console.log("字符串", strResult.toString())
}

// ------ 测试数组 -------
function test2() {
  const result = sort(numArr)
  console.log(result.toString());
}

// ------ 测试数值数组排序2 -------
function test3() {
  const result: number[] = []
  sort<number[]>(numArr).forEach((item: number) => {
    result.push(Number(item.toFixed(2)))
  })
  console.log(result.toString())
}

// ------ 测试字符串数组排序 -------
function test4() {
    const strArr: Array<string> = ["cba", "kkdf", "ndf", "bcdf", "dfd", "cdf"]
    console.log(sort(strArr).toString());
}

// ------ 测试中文排序 -------
function test5() {
  const chineseArr = ["武汉", "郑州", "太原", "济南", "沈阳", "大连"];
  console.log(sort(chineseArr).toString());
}

test1()
console.log("----------test1 完成-----------")
test2()
console.log("----------test2 完成-----------")
test3()
console.log("----------test3 完成-----------")
test4()
console.log("----------test4 完成-----------")
test5()
console.log("----------test5 完成-----------")
  • 输出
    长度为: 13
    字符串 aabdddefff...
    ----------test1 完成-----------
    1.883332,2,3,4,5,6,7,8,9,11,13,15,17,18,19,20
    ----------test2 完成-----------
    1.88,2,3,4,5,6,7,8,9,11,13,15,17,18,19,20
    ----------test3 完成-----------
    abc,bcdf,cdf,ddf,dfkk,dfn
    ----------test4 完成-----------
    大连,济南,沈阳,太原,武汉,郑州
    ----------test5 完成-----------
    
  • 在TypeScript(以及许多其他编程语言如Java和C#)中
  • 泛型(Generics)是一个强大的工具,它允许程序员编写可重用的组件
  • 这些组件可以处理多种类型的数据,而不仅仅是特定类型
  • 泛型不仅增强了代码的可重用性,还提高了代码的可读性和可维护性

泛型使用的好处

  • 1 )提高代码重用性
    • 泛型允许你编写一个函数、类或接口,它们可以处理多种类型的数据,而不仅仅是特定的数据类型
    • 这避免了为每个数据类型编写单独的代码。例如,在提供的quickSort函数中,通过使用泛型
    • 该函数可以处理任何类型的数组,而不仅仅是数字数组
  • 2 )增强代码可读性
    • 泛型允许你在代码中显式地表示类型参数,这使得代码更容易理解
    • 通过查看函数的签名,你可以立即知道它期望什么样的输入和输出,而无需深入了解函数的实现细节
    • 在sort函数中,通过重载,我们可以清晰地看到该函数可以接受字符串或数组,并且返回相应的类型
  • 3 )减少类型转换错误
    • 泛型可以减少不必要的类型转换错误。在强类型语言中
    • 类型不匹配会导致编译错误,这有助于在开发早期捕获潜在的错误
    • 通过使用泛型,你可以确保函数、类或接口只接受和返回特定类型的值
    • 这减少了在运行时发生类型错误的可能性
  • 4 )灵活的代码结构
    • 泛型使得代码结构更加灵活
    • 你可以编写可以处理多种类型数据的通用组件,并在需要时将它们组合在一起
    • 例如,在sort函数中,根据输入数据的类型
    • 函数可以选择使用不同的排序算法(如快速排序或字符串的localeCompare方法)
  • 5 )更好的性能
    • 虽然泛型本身并不直接提高性能,但它们可以帮助你编写更高效的代码
    • 通过使用泛型,你可以避免不必要的类型转换和装箱/拆箱操作,这些操作可能会对性能产生负面影响
    • 此外,泛型允许你编写更简洁的代码,这可以减少错误并提高整体性能
  • 6 )改进错误检查
    • 在编译时,泛型可以帮助你捕获类型相关的错误
    • 例如,如果你尝试将字符串传递给期望数字的函数,编译器将会报错
    • 这有助于在开发早期发现潜在的错误,并减少在运行时调试和修复错误的时间
  • 总之
    • 泛型是TypeScript(和其他支持泛型的编程语言)中一个强大的工具
    • 它可以帮助你编写更加可重用、可读、灵活和高效的代码
    • 通过使用泛型,你可以减少代码冗余,提高代码质量,并加速开发过程
    • 因此,在编写TypeScript代码时,考虑使用泛型来改进你的代码结构和性能是一个很好的做法
函数设计四大核心特性:从内置函数到模板重载的工程实践 在编程中,函数是构建软件的基础单元,其设计质量直接影响代码的可读性、可维护性和性能。理解函数的核心特性,如内置函数和函数重载,是提升代码质量的关键。内置函数由语言标准库提供,经过充分优化和测试,能有效避免重复造轮子,确保功能的可靠性和跨平台一致性。函数重载则允许在同一作用域内定义多个同名函数,通过参数列表的差异实现多态,显著提升代码的表达力和可读性。这些特性共同支撑起现代软件工程中模块化、泛型编程等核心思想,广泛应用于算法库、工具类设计、API接口封装等场景。本文以C++为例,深入解析内置函数、函数重载、函 阅读详情

相关推荐

Cocos Creator全局事件管理器:从设计到实战,告别组件耦合

在软件工程中,组件间通信是构建复杂应用的核心挑战之一。事件驱动架构通过解耦事件的发布者与订阅者,提供了一种松散耦合的通信机制,其核心原理是观察者模式。这种模式的技术价值在于显著提升了代码的可维护性、可测试性和模块复用性。在游戏开发、前端应用等场景中,它尤其适用于处理UI交互、游戏状态变更等一对多的消息广播。本文聚焦于Cocos Creator引擎,针对其内置事件系统在复杂业务逻辑下的局限性,深入探讨如何从零构建一个功能完善的全局事件管理器。该系统通过引入**类型安全**和**自动内存管理**等关键特性,解决

weixin_34409357的博客 410

2-1-9 TS 函数

构造函数的表达 type SomeConstructor = { new (s: string): String } function fn(ctor: SomeConstructor) { return new ctor("hello") } const str = fn(String) console.log(str) // hello 泛型函数 function firstElement<Type>(arr: Type[]): Type { retur

m0_38066007的博客 559

TypeScript接口声明合并原理与工程实践指南

接口声明合并是TypeScript类型系统的核心机制之一,本质是同名interface在相同作用域下的成员自动聚合,支撑类型定义的渐进式演进。其原理基于编译期符号合并算法,区别于type别名的静态不可变性,具备开放扩展、重载支持、模块化增强等技术价值。广泛应用于第三方库类型增强(如axios响应结构)、环境变量类型注入(NodeJS.ProcessEnv)、React组件Props分治设计、事件总线强类型注册等典型场景。掌握作用域一致性、成员兼容性、泛型限制等边界条件,可避免合并失效、类型冲突与CI构建异常

weixin_33912246的博客 384

深度掌握TypeScript中的重载【函数重载、方法重载】

TS 的函数重载比较特殊,和很多其他后端语言的方法重载相比,多了不少规则。函数签名[ function signature ]:函数签名=函数名称+函数参数+函数参数类型+返回值类型四者合成。在 TS 函数重载中,包含了实现签名和重载签名,实现签名是一种函数签名,重载签名也是一种函数签名。不完整模糊的 TS 函数重载定义:一组具有相同名字,不同参数列表的和返回值无关的函数。完整的函数重载定义:包含了以下规则的一组函数就是TS函数重载 :**规则1:**由一个实现签名+ 一个或多个重载签名合成。

coder__wang的博客 5511

LLM辅助编程效率三语言对比:Go/Python/TypeScript实战分析

在AI编程助手(如GitHub Copilot、CodeWhisperer)深度融入开发流程的今天,'编程效率'已从传统执行性能转向人机协同效能。本文围绕LLM对代码的理解精度、提示响应质量与验证反馈速度三大技术维度,解析Python的动态灵活性、TypeScript的类型约束力与Go的编译确定性如何影响AI生成代码的准确率、接受率和调试成本。结合真实开发任务(如带缓存的LLM客户端实现)、IDE工具链配置(Pylance/gopls/ts-node)及错误修复实测数据,揭示类型系统、语法确定性与标准库LL

cok8420的博客 599

Claude Code源码解析:TypeScript三层架构与AI编程工程实践

AI编程工具正从API调用走向深度工程化,其核心在于可复用、可测试、可移植的AI能力封装。TypeScript凭借强类型系统和编译期保障,成为构建高可信AI前端逻辑的首选语言;而模块化分层架构(逻辑/表现/胶水)则实现了AI技能与UI解耦,使Skill可独立单元测试、跨环境复用。npm的确定性依赖管理与Vite的精准HMR共同支撑了快速迭代,source map则升维为AI错误归因与调试信任基础设施。在VS Code插件、CI集成、本地IDE增强等场景中,这种以TypeScript为基石、以Skill为单元

weixin_30709061的博客 741

【TS学习】(13)有了泛型,还需要用重载吗

泛型和重载

qq_45739157的博客 860

Allegro17.2 出gerber文件详细流程 - 干货

Allegro17.2 出gerber文件详细流程 - 干货

u010614434的博客 1万+

typescript学习:泛型函数重载 + 交叉类型 + 类型断言

本文内容如下 泛型函数重载 + 交叉类型 + 类型断言 如果你都有了答案,可以忽略本文章,或去TS学习地图寻找更多答案 简单例子 将两个对象的属性合并 type objType1 = { name: string, age: number } type objType2 = { name: string, age: number, phone: number } let obj1: objType1 = { name: 'tao', age: 18 } let obj2: objType2 = {

weixin_44828005的博客 650

Oracle EBS R12.2 安装 -- Step by Step

Oracle EBS R12.2 安装 -- Step by Step

Albert Tan DBA之路 1514

FPGA实现AXI-Stream通信

本文介绍了在FPGA中实现AXI-Stream接口的工业级方案,重点解析了核心协议信号(TVALID/TREADY/TDATA/TLAST)与可选扩展信号,并提供了Verilog最小化实现示例。文章详细阐述了握手协议规则、时序约束方法,以及吞吐量优化技巧(如寄存器切片和双缓冲策略),同时给出了跨时钟域处理的异步FIFO解决方案。此外,还包含验证调试方法(Testbench结构和ILA触发设置)和典型应用场景(视频处理/网络传输),最后提供了资源消耗参考数据。该实现方案严格遵循Xilinx/Intel官方规范

whm128的博客 1465

TS泛型浅用

TS泛型 泛型可以创建可重用的组件,一个组件可以支持多种类型,解决类,接口,方法的复用性,以及对不确定数据类型的使用 class MinCla<T>{ public list:T[]=[]; add(value:T):void{ this.list.push(value) } min():T{ var minNum=this.list[0]; for(var i=0;i<this.list.length;i++

小菜鸟的博客 5207

【Linux】Windows11 安装 WSL2 并运行 Ubuntu 22.04 详细操作步骤

Windows 11 安装 WSL2 和 Ubuntu 22.04 指南 本文详细介绍在 Windows 11 上安装 WSL2 和 Ubuntu 22.04 的完整步骤,包括: WSL2 与 VirtualBox 的性能对比优势 系统版本检查与升级方法 两种安装方式(一键安装和手动安装) Ubuntu 22.04 的安装与配置 存储位置管理及迁移技巧 常用 WSL2 命令速查表 文章还提供了性能优化建议和常见问题解决方案,适合开发者和 Linux 爱好者快速搭建高效的开发环境。

No8g攻城狮的博客 2万+

typescript基础之泛型

我们可以在调用 identity 函数时,用尖括号来指定具体的类型,如 identity(1) ,也可以省略尖括号,让编译器自动推断类型,如 identity(1)。TypeScript 的泛型是一种创建可重用代码组件的工具,它可以让我们在定义函数、接口或类的时候,不预先指定具体的类型,而是在使用的时候再指定类型。泛型的语法是在函数名或类名后面加上一对尖括号,里面写上一个或多个类型变量,表示该函数或类可以接受不同类型的参数。• 定义通用的数据结构,如数组、链表、栈、队列、字典等。

hhbbeijing的专栏 349

【ESP32接入国产大模型之豆包】

🥳🥳🥳现在,我们在本教程中,您学习了如何使用ESP32接入语言大模型之豆包。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,后期会持续分享esp32跑freertos实用案列🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣如果你有任何问题,可以通过q group(945348278)加入鹏鹏小分队,期待与你思维的碰撞😘😘😘。

vor234的博客 1万+

rk3576 点亮 LCD(eDP)

RK3576 处理器集成了对 **eDP (Embedded DisplayPort)** 接口的支持,主要用于驱动嵌入式或笔记本电脑的内置屏幕。支持 **eDP 1.3 版本协议**, 最大可支持 ****4K@120Hz**。

weixin_35723192的博客 355

TypeScript接口声明合并:原理、规则与工程化实践

接口声明合并是TypeScript中实现类型渐进式扩展的核心机制,其本质是在相同作用域内对同名interface进行字段级交集计算,形成逻辑统一的类型定义。它基于声明空间(全局/模块/命名空间)隔离与成员类型差异化合并策略(属性兼容、方法重载、索引签名联合等),解决了JavaScript动态性与静态类型之间的张力。该机制显著提升第三方库增强、环境变量约束、React Props扩展等场景的类型安全性和协作效率,是大型项目应对类型碎片化与多源演进的关键基础设施。

dbp5156的博客 407

apache 403错误 Forbidden解决方法

当网页打开提示以下错误时,即出现了403错误。 Forbidden You don't have permission to access / on this server. 403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。通常情况可能(但不限于此)的原因有: 原因1:apache配置文件中没有对站点目录的权限许可,这通...

lmseo5hy的博客 1499

AccessGuard v0.5:ABAC 属性模型 — TypeScript 联合类型与 Discriminated Union 深度实战

Subject(主体):发起访问请求的实体,通常对应已认证用户。// Subject 属性的抽象基类型// 安全许可级别 1-5Resource(资源):被访问的目标实体。// Resource 属性的抽象基类型Action(操作):对资源执行的具体操作。// Action 操作类型Environment(环境):访问请求发生的上下文。// Environment 属性策略条件(Policy Condition)Policy(策略)

我的博客 451

k8s上分离集群seatunnel部署(生产推荐)

k8s上分离集群seatunnel部署(生产推荐)

寂夜了无痕的博客 890

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

终极指南:如何利用GPT-4-LLM比较数据集训练高性能奖励模型

GPT-4-LLM比较数据集是一个强大的工具,专为训练和评估奖励模型而设计,帮助开发者提升大语言模型的性能。该数据集包含大量经过人工标注的高质量问答对,涵盖多种任务类型和难度级别,是训练奖励模型的理想选择。 ## 为什么需要比较数据集? 在训练大语言模型时,奖励模型扮演着至关重要的角色。它能够评估模型生成内容的质量,引导模型朝着人类偏好的方向优化。而高质量的比较数据集正是训练有效奖励模型的基础

gitblog_00031的博客 341

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JavaScript API设计原则与实践指南

API设计是软件开发中的核心环节,良好的API设计能显著提升代码可维护性和开发效率。从技术原理看,API作为应用程序接口,定义了模块间的通信契约。在JavaScript生态中,类型系统、异步处理和错误机制等特性直接影响API设计范式。通过一致性原则、最小接口规范和结构化错误处理等技术手段,可以构建出高可用的API接口。这些设计模式在Web服务、微服务架构和Serverless场景中具有广泛适用性,特别是在处理分页查询、批量操作和性能优化等典型场景时效果显著。现代JavaScript特性如可选链、空值合并等语

682

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Vue-Pure-Admin:5分钟打造你的现代化管理后台完整解决方案

你是否曾为开发企业级后台管理系统而头疼?面对复杂的权限设计、繁琐的组件集成、移动端适配这些难题,是不是经常感觉时间都花在了重复造轮子上?现在,让我为你介绍一个能让你在5分钟内启动专业级后台系统的完整解决方案——Vue-Pure-Admin。 ## 场景痛点:为什么后台管理系统开发如此耗时? 想象一下这样的场景:你需要为公司开发一个内部管理系统,需要用户管理、权限控制、数据可视化、文件上传等基础

gitblog_00463的博客 768

MoonBit v0.10.0:trait约束与impl符号索引驱动的工程化跃迁

编程语言中的trait(特质)与impl(实现)是支撑类型安全与代码复用的核心抽象机制,其设计直接影响泛型编程能力、IDE开发体验和大型项目可维护性。MoonBit v0.10.0 重构trait语义模型,引入类型约束图谱实现编译期泛型推导;将impl块升级为具备唯一标识、作用域和方法索引的可寻址符号实体,使Ctrl+Click跳转至具体实现成为可能;同时落地轻量可控的template writing syntax,兼顾编译期元编程能力与错误可读性。这些改进共同提升了语言在基础设施、微服务网关及内部DSL等

weixin_33845881的博客 474

Lodash.js核心函数实战指南:提升JavaScript工程效率

JavaScript作为动态弱类型语言,在对象嵌套访问、数组去重、函数节流等基础操作上长期存在原生API碎片化、边界处理不健壮等问题。Lodash.js通过高度封装的工具函数,以声明式语法实现安全取值、深拷贝、防抖节流等高频需求,其模块化设计支持Tree Shaking,TypeScript类型定义完善,且经15000+测试用例验证边界场景。在中后台系统、电商页面、表单管理等需要高稳定性和快速迭代的工程场景中,Lodash已成为事实标准的js工具库。本文聚焦_.get、_.debounce、_.cloneD

weixin_30555515的博客 390

Claude Code多文件协同编辑失效诊断清单:12类典型场景+对应AST级修复命令(含CLI一键修复脚本)

快速定位并修复Claude Code多文件编辑协同失效问题。覆盖12类典型场景,提供AST级精准修复命令及CLI一键脚本,支持跨文件引用、符号同步与上下文一致性校验。诊断准、修复快、可复现,值得收藏。

LiteProceed的博客 178
上一篇: Go微服务: 日志系统ELK的应用
下一篇: Typescript高级: 深入理解工厂函数类型
Wang's Blog
博客等级 码龄12年 7433粉丝 2420原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值