当前位置: 首页 > news >正文

TypeScript基础篇 - TS的函数

目录

构造函数表达

泛型和函数

泛型函数

Contextual Typing【上下文映射,上下文类型】

泛型约束

手动指定类型

泛型的使用规范

对比

可选参数

思考:onClick中e的设计

函数重载

修改办法

操作符重载

THIS

void【空返回值】

思考为什么这样写?

Rest params

小结


构造函数表达

type SomeConstructor = {new (s: int):String
}
function fn(ctor: SomeConstructor) {return new ctor("hello")
}
const str = fn(String)
console.log(str) // hello

泛型和函数

泛型函数

function firstElement<Type>(arr: Type[]):Type {return arr[0]
}

Contextual Typing【上下文映射,上下文类型】

// map : a -> b
function map<Input, OutPut>(arr: Input[], func: (arg: Input) => Output): Output[] {return arr.map(func); //  Output[]
}
const parsed = map(["1", "2", "3"], (n) => parseInt(n))
// [1,2,3]

泛型约束

function minimumLength<Type extends { length: number }>(obj: Type,minimum: number
): Type {if (obj.length >= minimum) {return obj;} else {return { length: minimum };// 不能将类型“{ length: number; }”分配给类型“Type”。// "{ length: number; }" 可赋给 "Type" 类型的约束,// 但可以使用约束 "{ length: number; }" 的其他子类型实例化 "Type"}
}

手动指定类型

function combine<Type>(arr1: Type[], arr2: Type[]):Type[] {return arr1.concat(arr2);
}
const arr = combine([1,2,3], ["hello"]);// Error 不能将类型“string”分配给类型“number”。
const arr2 = combine<string | number>([1,2,3],["hello"]) // 手动指定string | number

泛型的使用规范

// 泛型的参数越简化越好,最少支持原则,高效,参数少
function firstElement1<Type>(arr: Type[]) { // 更简单 √,方便阅读return arr[0];
}
function firstElement2<Type extends any[]>(arr: Type) {return arr[0]
}

对比

对比下一组,哪个更好?

function filter1<T>(arr: T[], func: (arg: T) => boolean): T[] { 
// √ 泛型参数少,读起来方便return arr.filter(func);
}
function filter2<T, Func extends (arg: T) => boolean>(arr: T[], func: Func): T[] { 
// Func这个泛型没有必要return arr.filter(func);
}

可选参数

function myForEach(arr: any[], callback: (arg: any, index?:number)=> void){
// 可选参数index?:for (let i = 0; i < arr.length; i++) {callback(arr[i], i);    }
}

思考:onClick中e的设计

<div onClick={ e=>{} }></div> // e是可选参数
<div onClick={ ()=>{} }></div> // e是可选参数

函数重载

function add3<T> (a: T, b: T ) {return a + b // Error 运算符“+”不能应用于类型“T”和“T”。
}
// a,b不一定可以相加
// 函数的重载,可多次,基础方法
function add(a:number,b:number); // add(1,2)
function add(a:string,b:string); // add("1","2")
function add(a:number,b:string); // add(1,"2")
function add(a:string,b:number); // add("1",2)
function add(a:string); // add(1)
function add(a: any,b?:any) {if(!b) {b = 1    }return a + b
}

修改办法

function isSet<T>(x: any): x is Set<T> {return x instanceof Set
}
function add(a: number, b: number): number;
function add(a: string, b: string): string;
function add<T>(a: Set<T>, b: Set<T>): Set<T>;
function add<T>(a: T, b: T): T {if (isSet<T>(a) && isSet<T>(b)) {return new Set([...a, ...b]) as any}return (a as any) + (b as any)
}
const a = new Set<string>(["apple", "redhat"])
const b = new Set<string>(["google", "ms"])
console.log(add(a, b))
console.log(add(1, 2))
console.log(add("a", "k"))

操作符重载

THIS

interface DB {exec(sql: string) => any
}
function runSql(this: DB, sql: string) {this.exec(sql)
}
runSql.bind(new DB()).("select * from user")

void【空返回值】

// void
type voidFunc = () => void;
const f1: voidFunc = () => {return true;
}
const f2: voidFunc = () => true
const f3: voidFunc = function () {return true;
}

思考为什么这样写?

function safeParse(s: string): unknown { // 比any安全return JSON.parse(s); // as 断言;断言之前,unknown值是不能直接赋值给其他变量的
}

Rest params

// JS本身有这个方法
function multiply(n: number, ...m: number[]) {return m.map((x) => n * x);
}
// 无法重新声明块范围变量“a”。
const a = multiply(10, 1, 2, 3, 4);

小结

  • 重新思考泛型的作用?提供对共性的抽象,// add , filter
  • 思考函数重载的意义?为函数提供了更严格的类型检查方式,能让真正使用any这样的函数,作为参数,把它窄化,更精确的类型去表达,所有函数调用的类型都是准确的

相关文章:

TypeScript基础篇 - TS的函数

目录 构造函数表达 泛型和函数 泛型函数 Contextual Typing【上下文映射&#xff0c;上下文类型】 泛型约束 手动指定类型 泛型的使用规范 对比 可选参数 思考&#xff1a;onClick中e的设计 函数重载 修改办法 操作符重载 THIS void【空返回值】 思考为什么这样…...

Vue项目如何生成树形目录结构

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、有兴趣的可以关注一手。 前言 项目的目录结构清晰、可以帮助我们更快理顺项目的整体构成。在写文档之类的时候也比较方便。生成树形目录的方式有多种&#xff0c;我这里简单介绍其中一种较为简单的实现 过…...

postgresql四种逻辑复制的状态

准备 CreateCheckpoint&#xff0c;或者bgwriter启动时&#xff0c;或者创建logicalreplicationslot时都会调用LogStandbySnapshot 记录一个XLOG_RUNNING_XACTS类型的日志。日志中记录了所有提交的事务的xid(HistoricSnapshot) 启动&#xff08;SNAPBUILD_BUILDING_SNAPSHOT&…...

梯度下降法和牛顿法

梯度下降法和牛顿法都是优化方法。 梯度下降法 梯度下降法和相关知识可以参考导数、偏导数、梯度、方向导数、梯度下降、二阶导数、二阶方向导数一文。梯度下降法是一种迭代地每次沿着与梯度相反方向前进的不断降低损失函数的优化方法。梯度下降只用到一阶导数的信息&#xf…...

elment-ui的侧边栏 开关及窗口联动

<template><div class"asders"><el-aside width"200px"><div class"boxbody"><div>源码外卖</div><el-switch v-model"isCollapse" :active-value"true" :inactive-value"fals…...

【从零开始学习JAVA | 第三十二篇】 异常(下)新手必学!

目录 前言&#xff1a; Exceptions&#xff08;异常&#xff09;&#xff1a; 异常的两大作用&#xff1a; 异常的处理方式&#xff1a; 1.JVM默认处理 2.自己捕获异常 3.抛出处理 自定义异常&#xff1a; 异常的优点&#xff1a; 总结&#xff1a; 前言&#xff1a; 前…...

onnxruntime (C++/CUDA) 编译安装

一、克隆及编译 git clone --recursive https://github.com/Microsoft/onnxruntime cd onnxruntime/ git checkout v1.8.0如果克隆的时候报错&#xff1a; 执行以下&#xff1a; apt-get install gnutls-bin git config --global http.sslVerify false git config --global h…...

第三篇-Tesla P40+CentOS-7+CUDA 11.7 部署实践

第一篇-ChatGLM-webui-Windows安装部署-CPU版 第二篇-二手工作站配置 第三篇-Tesla P40CentOS-7CUDA 11.7 部署实践 硬件环境 系统&#xff1a;CentOS-7 CPU: 14C28T 显卡&#xff1a;Tesla P40 24G 准备安装 驱动: 515 CUDA: 11.7 cuDNN: 8.9.2.26 安装依赖 yum clean al…...

Unity游戏源码分享-ARPG游戏Darklight.rar

Unity游戏源码分享-ARPG游戏Darklight.rar 玩法 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88105464...

类型转换运算符

当我们想要将自定义类的对象转换为目标类型时&#xff0c;我们可以通过重载类型转换运算符&#xff08;conversion operator&#xff09;来实现。 以下是一个示例代码&#xff0c;展示了如何在 C 中定义一个自定义类&#xff0c;并重载类型转换运算符将对象转换为目标类型&…...

Kafka 入门到起飞系列 - 消费者组管理、位移管理

消费者组 - Consumer Group 上文我们已经讲过消费者组了&#xff0c;我们知道消费组的存在可以保证一个主题下一个分区的消息只会被组内一个消费者消费&#xff0c;从而避免了消息的重复消费 什么是消费组 - Consumer Group&#xff1f; 消费者组是Kafka 提供的可扩展且具有容…...

SpringBoot——数据层三组件之间的关系

简单介绍 在之前的文章中&#xff0c;我们介绍了一下SpringBoot中内置的几种数据层的解决方案&#xff0c;在数据层由三部分组成&#xff0c;分别是数据库&#xff0c;持久化技术以及数据源&#xff0c;但是我今天写着写着&#xff0c;突然就想不起来这三部分到底是干什么的了…...

LeetCode647.Palindromic-Substrings<回文子串>

题目&#xff1a; 思路&#xff1a; 错误代码&#xff1a;&#xff08;缺少部分判断&#xff09; 使用的是寻找回文子串的方法。以一个点为中心向两边扫描。但是有一点小问题。 因为回文子串是分奇偶的&#xff0c;所以需要两种判断方式。 看了下答案后发现我的代码距离答案一…...

React的hooks---useContext

Context 提供了一个无需为每层组件手动添加 props &#xff0c;就能在组件树间进行数据传递的方法&#xff0c;useContext 用于函数组件中订阅上层 context 的变更&#xff0c;可以获取上层 context 传递的 value prop 值 useContext 接收一个 context 对象&#xff08;React.…...

【Terraform学习】TerraformCloud入门介绍(快速入门)

TerraformCloud入门介绍 什么是 TerraformCloud&#xff1f; Terraform Cloud是Hashicorp Terraform的SaaS版本。 免费版功能 免费版功能包括版本控制集成、远程计划和实施远程计划和实施、通知及webhook、全http API驱动、状态管理、模拟计划、私有化模块注册器以及全HTTP界…...

linux实现运行java分包部署

1.打好包之后 找到bin文件夹下的 startup.sh文件 2.cd 进入bin文件夹下 3.执行 sh startup.sh 运行命令 4.如果出现此错误 是Windows和Linux的.sh脚本文件格式不同&#xff0c;如果在脚本中有空行&#xff0c;脚本是在Windows下进行编辑之后上传到linux上去执行的话&#xff0c…...

数据安全之全景图系列——数据分类分级落地实践

1、数据分类分级现状 我们正处于一个数据爆炸式增长的时代&#xff0c;随着产业数字化转型升级的推进&#xff0c;数据已被国家层面纳入生产要素&#xff0c;并且成为企业、社会和国家层面重要的战略资源。数据分类分级管理不仅是加强数据交换共享、提升数据资源价值的前提条件…...

C++实现MySQL数据库连接池

C实现MySQL数据库连接池 涉及技术 MySQL数据库编程、单例模式、STL容器、C11多线程&#xff08;线程互斥、线程互斥、线程同步通信和unique_lock&#xff09;、智能指针shared_ptr、lambda表达式、生产者-消费者线程模型。 项目背景 为了提升MySQL数据库&#xff08;基于C/…...

day4 驱动开发 c语言学习

不利用系统提供的register_chrdev&#xff0c;自己实现字符设备的注册 底层代码 led.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include "head.h…...

history命令:显示命令执行时间

1.修改配置文件 vim /etc/profile 添加内容 export HISTTIMEFORMAT"%Y-%m-%d %H:%M:%S " ​ #注意&#xff1a;在末尾的“引号”与“S”之间&#xff0c;加入一位空格&#xff0c;将日期时间和历史命令用空格相隔开来。 你也可以换一种清晰的形式&#xff0c;效果…...

实战指南:基于快马平台,快速构建可部署的unet卫星图像分割系统

今天想和大家分享一个实战项目&#xff1a;基于UNet的卫星图像建筑物分割系统。这个项目特别适合在InsCode(快马)平台上快速搭建&#xff0c;因为它涉及从数据处理到模型部署的完整流程&#xff0c;而平台的一键部署功能正好能省去繁琐的环境配置工作。 项目背景与需求分析 卫星…...

3分钟搭建免费B站视频解析服务:零基础教程

3分钟搭建免费B站视频解析服务&#xff1a;零基础教程 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse 你是否曾经想要保存B站的精彩视频却不知道如何操作&#xff1f;或者需要在自己的网站上嵌入B站视…...

Phi-3-mini-128k-instruct快速部署:Anaconda环境配置与模型调用详解

Phi-3-mini-128k-instruct快速部署&#xff1a;Anaconda环境配置与模型调用详解 你是不是也遇到过这种情况&#xff1a;看到一个很酷的AI模型&#xff0c;想赶紧试试&#xff0c;结果被各种环境依赖、版本冲突搞得头大&#xff1f;别担心&#xff0c;今天咱们就来搞定Phi-3-mi…...

MagiskHide Props Config:设备属性管理的3大维度与安全检测绕过全指南

MagiskHide Props Config&#xff1a;设备属性管理的3大维度与安全检测绕过全指南 【免费下载链接】MagiskHidePropsConf This tool is now dead... 项目地址: https://gitcode.com/gh_mirrors/ma/MagiskHidePropsConf 一、价值定位&#xff1a;为什么每个root用户都需要…...

Sunshine开源游戏串流:打造你的专属云游戏服务器终极指南

Sunshine开源游戏串流&#xff1a;打造你的专属云游戏服务器终极指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在任何设备上畅玩PC游戏&#xff1f;厌倦了被商业云游戏平…...

Java微服务集成TranslateGemma:企业级翻译中台构建

Java微服务集成TranslateGemma&#xff1a;企业级翻译中台构建 1. 为什么需要企业级翻译中台 最近在给一家跨境电商平台做技术咨询时&#xff0c;客户提到一个很实际的问题&#xff1a;他们的客服系统、商品管理系统、营销内容平台各自维护着不同的翻译逻辑。客服用的是第三方…...

[模电]从PN结到实用电路:二极管的深度解析与设计指南

1. PN结&#xff1a;二极管的物理基础 想象一下把一块P型半导体和N型半导体紧密贴合在一起&#xff0c;就像把两块不同颜色的橡皮泥揉捏在一起。P型半导体里充满了带正电的"空穴"&#xff08;可以理解为缺少电子的位置&#xff09;&#xff0c;而N型半导体则富含自由…...

忍者像素绘卷GPU算力适配:A10/A100/V100多卡推理吞吐量对比

忍者像素绘卷GPU算力适配&#xff1a;A10/A100/V100多卡推理吞吐量对比 1. 技术背景与测试目标 忍者像素绘卷作为一款基于Z-Image-Turbo深度优化的图像生成工作站&#xff0c;其核心价值在于将传统漫画创作与16-Bit复古游戏美学相结合。在实际应用中&#xff0c;GPU算力直接决…...

从synchronized到CompletableFuture:Java多线程完全进阶指南

在当今多核处理器普及的计算时代&#xff0c;充分利用硬件资源成为提升程序性能的关键。Java作为企业级应用的主流语言&#xff0c;其内置的多线程支持让并发编程变得触手可及。然而&#xff0c;多线程编程如同一把双刃剑——用得好&#xff0c;能成倍提升系统吞吐量&#xff1…...

手把手教你用Python实现熵权PCA:从数据清洗到可视化,一个案例全讲透

用Python实战熵权PCA&#xff1a;电商商品竞争力分析全流程解析 在电商平台的海量商品中&#xff0c;如何快速识别出真正具有竞争力的产品&#xff1f;传统的人工筛选方式不仅效率低下&#xff0c;还容易受到主观偏见的影响。本文将带你用Python实现一个完整的熵权PCA分析流程&…...