Typescript高级: 函数重载和constructor重载

TypeScript 方法重载(Method Overloading)全面解析 在软件开发中,我们经常会遇到需要根据不同的输入参数执行相似但不完全相同操作的情况。TypeScript 作为 JavaScript 的超集,提供了方法重载(Method Overloading)这一强大特性,使开发者能够以类型安全的方式处理多种参数组合。本文将深入探讨 TypeScript 中方法重载的实现原理、应用场景以及最佳实践。 阅读详情

概述

  • 在 TypeScript 中,类的重载主要涉及到方法的重载(Overloading),而很少涉及构造函数的重载
  • 因为 TypeScript 的类构造函数不支持像一些其他语言(如 C++ 或 Java)那样的传统意义上的重载
  • 类的构造函数(constructor)本身并不支持传统意义上的重载,因为构造函数只有一个实际的实现
  • 但是,可以通过为构造函数提供不同的参数类型或数量来模拟构造函数的重载效果
  • 这通常是通过使用联合类型(union types)和类型守卫(type guards)来实现的

方法重载

  • 方法重载允许你使用同一个方法名来定义多个方法

  • 但每个方法的参数类型或数量必须不同,这样,当调用该方法时

  • TypeScript 编译器会根据提供的参数类型和数量来确定应该调用哪个具体的实现

  • 代码实现

    class Greeter {  
        // 方法重载的声明部分  
        greet(name: string): string;  
        greet(age: number): string;  
        greet(nameOrAge: string | number): string {  
            if (typeof nameOrAge === 'string') {  
                return `Hello, ${nameOrAge}`;  
            } else {  
                return `Hello, you are ${nameOrAge} years old`;  
            }  
        }  
    }  
      
    const greeter = new Greeter();  
      
    console.log(greeter.greet('Alice')); // 输出: Hello, Alice  
    console.log(greeter.greet(30));      // 输出: Hello, you are 30 years old
    
  • 在上面的例子中,greet 方法被声明了两次

  • 一次接受一个字符串参数,另一次接受一个数字参数

  • 然后,在方法体内部,我们使用 typeof 运算符来确定传入的参数类型

  • 并据此返回不同的字符串

  • 需要注意的是,TypeScript 并不在运行时检查重载

  • 它只是在编译时检查参数的类型和数量,以确保调用方法的代码是正确的

  • 实际的方法实现(在本例中是最后一个 greet 方法定义)负责处理所有可能的调用情况

构造函数的重载

  • 关于构造函数重载的说明

  • 虽然 TypeScript 不支持传统意义上的构造函数重载

  • 但你可以通过类型守卫和联合类型来模拟这种效果

  • 例如,你可以创建一个接受不同参数类型的构造函数,并在类内部使用这些参数

  • 然而,这并不是真正的构造函数重载,因为 TypeScript 仍然只会有一个实际的构造函数实现

  • 下面是一个 TypeScript 类构造函数“重载”的示例:

    class MyClass {  
        private type: 'string' | 'number';  
        private value: string | number;  
      
        // 构造函数接受一个字符串参数  
        constructor(value: string);  
        // 构造函数接受一个数字参数  
        constructor(value: number);  
        // 实际的构造函数实现  
        constructor(value: string | number) {  
            if (typeof value === 'string') {  
                this.type = 'string';  
            } else if (typeof value === 'number') {  
                this.type = 'number';  
            } else {  
                throw new Error('Invalid constructor parameter');  
            }  
            this.value = value;  
        }  
      
        getType(): 'string' | 'number' {  
            return this.type;  
        }  
      
        getValue(): string | number {  
            return this.value;  
        }  
    }  
      
    // 使用字符串构造 MyClass 实例  
    const myClassString = new MyClass('Hello');  
    console.log(myClassString.getType()); // 输出: string  
    console.log(myClassString.getValue()); // 输出: Hello  
      
    // 使用数字构造 MyClass 实例  
    const myClassNumber = new MyClass(42);  
    console.log(myClassNumber.getType()); // 输出: number  
    console.log(myClassNumber.getValue()); // 输出: 42
    
  • 在这个例子中,我们定义了一个 MyClass 类,它的构造函数接受一个 string 或 number 类型的参数

  • 然后,在构造函数的实现中,我们根据传入的参数类型来设置类的 type 属性,并存储值到 value 属性中

  • 虽然 TypeScript 编译器允许我们为构造函数声明多个签名,但实际上只有一个构造函数实现

  • 请注意,虽然这种方式在类型检查时可以提供类似于重载的效果,但它在运行时并不会检查参数类型

  • 因此,如果传入非 string 或非 number 类型的参数,我们需要在构造函数内部添加额外的逻辑来处理这种情况,或者抛出一个错误

  • 这种“重载”构造函数的方式并不是 TypeScript 的原生特性,而是利用 TypeScript 的类型系统和类型守卫来模拟的

  • 如果你需要更复杂的构造函数行为,可能需要考虑使用工厂函数或静态方法来代替重载的构造函数

  • 总的来说

    • TypeScript 中的方法重载允许你以更清晰、更直观的方式编写代码
    • 尤其是在处理具有多种可能输入类型的函数或方法时
    • 不过,你应该谨慎使用重载,确保每个重载都有明确的意义和用途,以避免代码变得复杂和难以理解
typescript 函数重载 在 TypeScript 中,函数重载(Function Overloading)是指通过为同一个函数提供多个不同的签名(参数类型和数量),以便根据实际传入的参数类型和数量,在编译时选择正确的函数声明进行调用。通过函数重载,我们可以定义一组函数声明,每个声明都描述了函数的参数和返回类型。当我们调用函数时,TypeScript 编译器会根据实际传入的参数类型和数量,选择最匹配的函数重载进行调用。 阅读详情

相关推荐

鸿蒙Harmony实战:Arkts开发(构造函数)

类声明可以包含用于初始化对象状态的构造函数。

DMZDAMS的博客 2791

TypeScript学习笔记(9)-类

类是对一个对象的描述,可以使理解更具象化。比如:传统汽车BBA,电动汽车 目前比较火的问界M9。电动汽车也继成了汽车的基本属性对吧。比如有几个车轮,几个车门,车的颜色,车的品牌。我们买车都是看品牌对吧。它也继成了车的行为比如,可以加速,刹车,拐弯。当 电动汽车继成 汽车时,它包括了汽车的所有属性和方法,以及扩展了一个 属性imax 巨幕电影 和方法 看电影实例化类的分类实例类型静态化类型关键字。参数列表,定义在创建新实例时将传递给新对象的参数。

wdk996的博客 1290

TypeScript 中的函数重载

函数重载是 TypeScript 中的一个重要特性,它允许我们为同一个函数提供多个不同的函数签名和实现,以便根据不同的参数类型或个数来调用不同的实现。函数重载是 TypeScript 中的一项强大特性,它允许我们为同一个函数提供多个不同的函数签名和实现,以便根据不同的参数类型或个数来调用不同的实现。在上面的示例中,实现部分的代码满足了所有的函数签名:无论是字符串还是数字类型的参数,都能正常处理并返回正确的结果。通过函数重载,我们可以根据不同的参数类型来调用不同的实现逻辑,从而实现了字符串和数字的反转操作。

ZdqDeveloper的博客 387

TS的constructor构造函数的学习

constructor构造函数的学习

wuguanc的博客 2885

【Flink】状态编程: 订单超时告警

文章目录一、基础概念二、Flink状态编程1、支持的状态类型2、Managed Keyed State六种类型基本API状态的生命周期3、Managed Operator State三、案例:订单延迟告警统计1、需求描述2、需求分析3、数据与模型4、详细实现 一、基础概念 在Flink架构体系中,有状态计算可以说是Flink非常重要的特性之一。 有状态计算是指: 在程序计算过程中,在Flink...

一只皮皮熊 2864

树莓派c语言串口通讯程序

在网上搜了很多关于树莓派串口通讯的例子,但是都是用python写的,虽然python很有名,而且最近也在学习这门语言, 但是还是想用c语言实现一下,因为需要用到整套系统里,其他内容都是用c语言写的。但是网上没有找打现成的。 还好,之前做过天嵌2440开发板的串口程序(参照天嵌工程师提供的代码),发现串口程序其实是通用的, 驱动层屏蔽了硬件细节,个人猜测,几乎所有移植好的系统的串口,都可以用一

realank的专栏 1万+

TypeScript函数重载与constructor重载:从类型体操到工程实践

在TypeScript中,类型系统是确保代码可靠性的核心机制,它通过静态类型检查在编译阶段捕获潜在错误。其原理在于为JavaScript添加类型注解和类型推断,使开发者能够定义变量、函数参数和返回值的具体类型。这一机制的技术价值在于显著提升代码的可维护性、团队协作效率和开发体验,减少运行时错误。应用场景广泛,尤其在构建大型前端应用、库开发或需要严格接口契约的API设计时至关重要。本文聚焦于**函数重载**与**constructor重载**这两个高级类型特性,它们通过声明多个精确的类型签名,解决了单一宽泛类

weixin_34212762的博客 390

yolov8的Detect层详解(输出维度改动)

对于部署端需要拿到onnx的output进行后处理,但是基于anchor_free的yolov8输出是1*(4+cls)*8400,不是我们常见的ncwh格式,所以对Detect层进行了学习,分享一下体会。

yjcccccc的博客 2万+

The Concise TypeScript Book:函数重载(Function Overloads)完整实战指南

函数重载是 TypeScript 在类型层面为"同一个函数名支持多种调用方式"提供的核心机制:通过一组**重载签名**对外暴露不同的调用契约,再用一个**实现签名**兜底完成真正的逻辑。本指南以开源项目《The Concise TypeScript Book》法文版 [overloads.md](https://link.gitcode.com/i/f756a091e4ab1faac759c5ce

gitblog_01126的博客 389

带挂牵引车前向运动模型推导及仿真实现

牵引车-半挂车的车辆结构与普通的车辆相比增加了一个半挂车,它们之间通过鞍座相连接,为了分析半挂牵引车运动过程中的位姿和状态,本文将基于车辆的机械结构建立对应的运动学模型,该模型基于以下假设: 车辆行驶过程中,道路平坦且无凸凹; 车辆低速行驶,且运行过程中车身无侧倾和俯仰运动; 车辆行驶过程中,轮胎无形变,无侧向滑动,且无侧向力; 牵引车和半挂车均满足阿克曼转向几何原理; 牵引车与半挂车不会发现折叠。

jianmo的博客 3184

基于RAG(Retrieval Augmented Generation)架构的简单问答系统的Python实现示例

以下是一个基于RAG(Retrieval Augmented Generation)架构的简单问答系统的Python实现示例。这个系统使用langchain库进行文档处理、检索,以及与大语言模型交互。

max500600的博客 743

The Concise TypeScript Book 实战:掌握 TypeScript 函数重载(Function Overloads)从签名到实现

本篇指南以开源项目《The Concise TypeScript Book》的 [Sobrecargas (Overloads) 章节](https://link.gitcode.com/i/8e2f729a0b73073d8d8ebd2e0ed70aac) 为骨架,系统讲解 TypeScript 函数重载的核心机制:如何为同一个函数名声明多条重载签名、如何编写与之兼容的实现签名,以及如何在类方法

gitblog_00967的博客 248

深入理解 HTTP 协议中的 Content-Type

是 HTTP 协议中的一个头部字段(Header),用于指示请求或响应中实体主体(body)的媒体类型(Media Type),也称为MIME 类型(Multipurpose Internet Mail Extensions)。

h a 6 6 6 c k 为 你解决复杂难题! 999

TypeScript 函数重载实战指南:多签名函数、类方法与兼容性规则(The Concise TypeScript Book 第 52 章)

本文基于《The Concise TypeScript Book》开源文档第 52 章 "Overload"(印尼语版,位于 [overloads.md](https://link.gitcode.com/i/c589719a44e58bff31990fefe0539dd2)),系统讲解 TypeScript 函数重载的完整机制:如何为一个函数定义多个调用签名、实现签名与重载签名的兼容性规则、类方

gitblog_00597的博客 76

【知识图谱】实践篇——基于知识图谱的《红楼梦》人物关系可视化及问答系统实践:part6基于图谱的问答实现

前序文章:本部分则是整个项目的核心内容——基于图谱的问答。需要实现的是对于“简单问题”进行解析,然后从图谱数据库中查询与该人员及其相关人员信息,返回到前端并显示该人员的基本信息。除此之外,用户可以点击返回的结果人员节点,页面能够显示该用户的个人基本信息。那么现在就开始吧。根据源码实现问答形式,其实是比较简单的。原代码中使用ltp对问题进行分词,选取具有名次词性的关键词进行处理。 ltp配置稍许麻烦,我使用jieba分词工具对问题进行分词,然后再按照原文提取问句中人物及关系,然后构建cypher neo4j查

让算法融入生活,改变生活! 2939

最优化方法与数学建模

在本篇博客中,我们将探讨最优化方法在数学建模中的应用。首先,我们将介绍几种常见的最优化方法,如梯度下降、牛顿法和遗传算法。接着,我们将详细阐述这些方法的原理和算法。最后,我们将通过一个数学建模案例,展示如何使用Matlab实现这些方法。本文旨在为大家提供一个清晰的思路,以便更好地理解和应用最优化方法。

YOLO 439

The Concise TypeScript Book 深度解读:TypeScript 类(Class)完整实战指南

> 本指南基于开源项目 The Concise TypeScript Book 中关于类的章节(英文原版见 [website/src/content/docs/book/class.md](https://link.gitcode.com/i/07e22a9457259f9f91870ae5ad674051),法文译本见 [website/src/content/docs/fr-fr/book/c

gitblog_00858的博客 794

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

typescript的重载

typescript 重载 方法重载 构造器重载

qq_43498949的博客 710

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

TypeScript 类完全指南:The Concise TypeScript Book 中 class 的完整实战解析

本指南以 The Concise TypeScript Book 的 [类(Class)章节](https://link.gitcode.com/i/133ef5119177f9e0eb41b604676fd533)(阿拉伯语版位于 [website/src/content/docs/ar/book/class.md](https://link.gitcode.com/i/d1afbedc9533

gitblog_00711的博客 797

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

一文让你搞懂TS重载

函数名相同,而形参不同的多个函数在JS中,由于弱类型的特点和形参与实参可以不匹配,是没有函数重载这一说的 但在TS中, 与其它面向对象的语言(如Java)就存在此语法总的来说:函数重载:函数名字相同,允许在同一范围内指定多个同名函数,函数的参数几个数不同函数重载的概念主要由两部分组成。1.重载签名 2.实现签名好的,我们举个例子看一下:首先声明一个函数调用此函数:输出的结果如下:这是我们发现传入的数据最后两条是undefined,此时声明一个函数重载。

Mangcun_tutu的博客 733

The Concise TypeScript Book 实战解析:TypeScript 类(Class)语法与面向对象编程完整指南

本篇指南以开源仓库 [typescript-book](https://link.gitcode.com/i/90a7f7acd34713db4cc07146cb11aa65)(The Concise TypeScript Book)中「Класс / Class」章节([俄语原文](https://link.gitcode.com/i/3d68219dcd4a9e96a40cb5c897069a

gitblog_00656的博客 240

TypeScript构造函数重载:从C#到3D图形编程的实践

构造函数重载是面向对象编程中的基础概念,允许类通过不同参数组合进行实例化。在静态类型语言中,这一特性需要编译器支持多签名验证,而TypeScript通过类型擦除机制在编译时实现类型检查。这种设计在3D图形编程框架如Babylon.js中尤为重要,开发者需要处理向量、矩阵等数学对象的各种初始化方式。通过联合类型和可选参数,TypeScript在保持JavaScript灵活性的同时提供了类型安全。实际工程中,合理使用重载声明能显著提升IDE智能提示质量,而工厂方法和Builder模式则能应对复杂构造逻辑。从C#

weixin_34248705的博客 418

TypeScript 类(Classes)完全指南:The Concise TypeScript Book 精讲

> 本文以开源仓库 typ/typescript-book(《The Concise TypeScript Book》)官方文档 [class.md](https://link.gitcode.com/i/9f0462d57d935cb437fc521534548053)(葡萄牙语版,与 [英文原版](https://link.gitcode.com/i/b8186120f0004e1029db3

gitblog_00982的博客 59

TS构造函数的重载

直接上代码 通过传递两个不同参数类型来求面积实现 不理解的话,可以看TS函数重载 type areaType = { width: number, height: number } class Squar { public width public height constructor(width_:number, height_:number) constructor(valueObj: areaType) constructor(public o

qq_43853213的博客 1034

The Concise TypeScript Book 精读:TypeScript 类(Class)完整指南——构造、封装、继承与装饰器实战

本指南以开源仓库 [The Concise TypeScript Book](https://link.gitcode.com/i/7fd145e15e7f12627de2b10f4860aac9) 的 [Class 章节](https://link.gitcode.com/i/718212d74f1bc00345e80fdaa23be077) 为主体,系统讲解 TypeScript 中类(cla

gitblog_00361的博客 270

The Concise TypeScript Book:全面掌握 TypeScript Class 面向对象编程

本文基于开源项目 **The Concise TypeScript Book**(仓库 `typ/typescript-book`)中印尼语章节 [class.md](https://link.gitcode.com/i/fdf63c76eb87351a7de665ecca573dca)(英文原版位于 [website/src/content/docs/book/class.md](https:/

gitblog_00294的博客 154
上一篇: Typescript高级: is 类型守卫
下一篇: Nginx: proxy_set_header 与 add_header 区别
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值