TS系列(5):泛型和类型声明文件

TS系列(1):TS是什么?如何使用?

TS系列(2):类型声明、类型推断和类型总览

TS系列(3):常用类型(详细)

TS系列(4):常用类型之类、抽象类和接口

话接上回,什么是泛型?什么是类型声明文件?

八、泛型

泛型允许我们在定义函数、类或接口时,使用类型参数来表示未指定的类型,这些参数在具体使用时,才被指定具体的类型,泛型能让同一段代码适用于多种类型,同时仍然保持类型的安全性。

举例来说:如下代码中<T>就是泛型,不一定叫T,设置泛型后即可在函数中使用T来表示该类型:

泛型函数

function logData<T>(data: T): T {
    console.log(data)
    return data
}

logData(10) // 不指定泛型,TS可以自动对类型进行推断
logData<number>(100) // 指定泛型
logData<string>('hello') // 指定泛型

泛型数组

// 方式1
function fn1<T>(arr: T[]): T[] {
    console.log(arr.length)
    return arr
}

// 方式2
function fn2<T>(arr: Array<T>): Array<T> {
    console.log(arr.length)
    return arr
}

多个泛型

function logData<T, K>(data1: T, data2: K): T | K {
    console.log(data1, data2)
    return Date.now() % 2 ? data1 : data2
}

logData(100, 'hello') // 不指定泛型,TS会自动对类型进行推断
logData<number, string>(100, 'hello') // 指定泛型
logData<string, boolean>('hello', false) // 指定泛型

泛型接口

// 示例1
interface PersonInterface<T> {
    name: string,
    age: number,
    extraInfo: T
}

let p1: PersonInterface<string>
let p2: PersonInterface<number>

p1 = {
    name: '张三',
    age: 18,
    extraInfo: '厉害人物'
}
p2 = {
    name: '李四',
    age: 18,
    extraInfo: 250
}

// 示例2
interface Info<T> {
    like: T
}
let zhangsan: Info<string> = {
    like: '篮球'
}
let lisi: Info<string[]> = {
    like: ['篮球']
}

// 示例3
interface fn<T> {
    (a1: T, a2: T): T[]
}
let f1: fn<string> = function(a, b) {
    return [a, b]
}
let f2: fn<number> = function(a, b) {
    return [a, b]
}
console.log(f1('1', '2')) // ['1', '2']
console.log(f2(1, 2))			// [1, 2]

泛型约束(指定泛型类型)

// 示例1
interface PersonInterface {
    name: string,
    age: number
}

function logPerson<T extends PersonInterface>(info: T): void {
    console.log(`我叫${info.name},今年${info.age}岁了`)
}

logPerson({ name: '张三', age: 18 })

// 示例2
function fn<T extends string|any[]>(a: T):number {
    return a.length
}
fn('hello') // 正常
fn([1, 2, 3]) // 正常
fn(123) // Argument of type 'number' is not assignable to parameter of type 'string | any[]'

泛型类

class Person<T> {
    constructor(
        public name: string,
        public age: number,
        public extraInfo: T
    ) { }
    speak() {
        console.log(`我叫${this.name},今年${this.age}岁了`)
        console.log(this.extraInfo)
    }
}

const p1 = new Person<string>('小明', 10, '很聪明')

type JobInfo = {
    title: string
    company: string
}

const p2 = new Person<JobInfo>('张三', 30, { title: '总经理', company: '华夏科技公司' })

keyof

interface Info {
    name: string,
    age: number
}
let zhangsan: Info = {
    name: 'zhangsan',
    age: 10
}
getInfoValue(zhangsan, 'name')

// 示例1
function getInfoValue(info: Info, key: string): void {
    // 这里会报错,因为传入的 key 可能不是 Info 的属性
    console.log(info[key])
}

// 示例2
function getInfoValue(info: Info, key: keyof Info): void {
    console.log(info[key])
}

// 示例3
function getInfoValue<T extends keyof Info>(info: Info, key: T): Info[T] {
    return info[key]
}

九、类型声明文件

类型声明文件是 TypeScript 中的一种特殊文件,通常以.d.ts作为扩展名。它的主要作用是为现有的 JavaScript 代码提供类型信息,使得 TypeScript 能够在使用这些 JavaScript 库或模块时进行类型检查和提示

demo.js

export function add(a, b) {
  return a + b
}

export function mul(a, b) {
  return a * b
}

demo.d.ts

declare function add(a: number, b: number): number
declare function mul(a: number, b: number): number

export { add, mul }

example.ts

import { add, mul } from './demo.js'

const x = add(2, 3) // x 类型为 number
const y = mul(4, 5) // y 类型为 number

console.log(x, y)

好了,分享结束,谢谢点赞,下期再见。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Java-IO模型

所谓I/O就是计算机内存与外部设备之间拷贝数据的过程。由于CPU访问内存的速度远远高于外部设备&#xff0c;因此CPU是先把外部设备的数据读到内存里&#xff0c;然后再进行处理。对于一个网络I/O通信过程&#xff0c;比如网络数据读取&#xff0c;会涉及两个对象&#xff0c;一…

Ubuntu 开机自启动 .py / .sh 脚本,可通过脚本启动 roslaunch/roscore等

前言 项目中要求上电自启动定位程序&#xff0c;所以摸索了一种 Ubuntu 系统下开机自启动的方法&#xff0c;开机自启动 .sh 脚本&#xff0c;加载 ROS 环境的同时启动 .py 脚本。在 . py 脚本中启动一系列 ROS 节点。 一、 .sh 脚本的编写 #!/bin/bash # gnome-terminal -- …

javaWeb,Maven

前端打包的程序放在nginx中 查看哪个程序占用了80端口号 Maven&#xff1a;

rk3399开发环境的介绍

零. 前言 由于Bluez的介绍文档有限&#xff0c;以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求&#xff0c;加上网络上其实没有一个完整的介绍Bluez系列的文档&#xff0c;所以不管是蓝牙初学者还是蓝牙从业人员&#xff0c;都有不小的难度&#xff0c;学习曲线也相…

生产绩效考核管理的六大指标

生产绩效考核管理的六大指标 绩效考核是指生产部所有人员通过不断丰富自己的知识、提高自己的技能、改善自己的工作态度&#xff0c;努力创造良好的工作环境及工作机会&#xff0c;不断提高生产效率、提高产品质量、提高员工士气、降低成本以及保证交期和安全生产的结果和行为…

极狐GitLab 17.4 升级指南

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab https://dl.gitlab.cn/6y2wxugm 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文分享极狐GitLab 17.4 升级…

9.24作业

将昨天的My_string类中的所有能重载的运算符全部进行重载 、[] 、>、<、、>、<、! 、&#xff08;可以加等一个字符串&#xff0c;也可以加等一个字符&#xff09;、输入输出(<< 、 >>) 代码如下 MyString.h #ifndef MYSTRING_H #define MYSTRING_…

检查一个CentOS服务器的配置的常用命令

在CentOS系统中&#xff0c;查看服务器配置的常用命令非常丰富&#xff0c;这些命令可以帮助用户快速了解服务器的硬件信息、系统状态以及网络配置等。以下是一些常用的命令及其简要说明&#xff1a; 1. 查看CPU信息 (1) cat /proc/cpuinfo&#xff1a;显示CPU的详细信息&…

react+antdMobie实现消息通知页面样式

一、实现效果 二、代码 import React, { useEffect, useState } from react; import style from ./style/index.less; import { CapsuleTabs, Ellipsis, Empty, SearchBar, Tag } from antd-mobile; //消息通知页面 export default function Notification(props) {const [opti…

国家推动工业制造业数字化转型的政策与措施综述

在全球化与信息化浪潮的推动下&#xff0c;工业制造业正经历着前所未有的数字化转型。这一变革不仅深刻重塑了生产方式与商业模式&#xff0c;更成为提升国家竞争力、促进经济高质量发展的关键驱动力。随着科技的飞速发展&#xff0c;数字化转型已成为工业制造业转型升级的必然…

基于微信小程序的健康管理系统(源码+定制+文档)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

叉车防撞系统方案,引领安全作业新时代

在现代工业的舞台上&#xff0c;叉车如同忙碌的“搬运工”&#xff0c;在仓储和制造环境中发挥着不可或缺的作用。然而&#xff0c;随着叉车使用频率的不断攀升&#xff0c;安全事故也如影随形&#xff0c;给企业带来经济损失的同时&#xff0c;更严重威胁着操作人员的生命安全…

拓扑结构的理解

拓扑结构是数学中的一个重要概念&#xff0c;主要研究空间的性质及其在连续变换下的保持不变的特征。它是拓扑学的基础内容之一&#xff0c;广泛应用于多个领域&#xff0c;包括数学、物理、计算机科学等。 基本概念 1. 拓扑空间&#xff1a; 一个集合 X 和一个拓扑T 的组合…

毕业设计选题:基于ssm+vue+uniapp的购物系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

基于Python可视化的学习系统的设计与实现(源码+文档+调试+答疑)

文章目录 一、项目介绍二、视频展示三、开发环境四、系统展示五、代码展示六、项目文档展示七、项目总结 大家可以帮忙点赞、收藏、关注、评论啦 &#x1f447;&#x1f3fb; 一、项目介绍 随着计算机技术发展&#xff0c;计算机系统的应用已延伸到社会的各个领域&#xff0c…

真正的Open AI ——LLaMA颠覆开源大模型

1. LLaMA 简介 LLaMA&#xff08;Large Language Model Meta AI&#xff09;是由Meta&#xff08;原Facebook&#xff09;推出的一个大型语言模型系列&#xff0c;旨在通过更小的模型规模和更少的计算资源&#xff0c;实现与其他主流语言模型&#xff08;如GPT&#xff09;相媲…

Linux-TCP重传

问题描述&#xff1a; 应用系统进行切换&#xff0c;包含业务流量切换&#xff08;即TongWeb主备切换&#xff09;和MYSQL数据库主备切换。首先进行流量切换&#xff0c;然后进行数据库主备切换。切换后发现备机TongWeb上有两批次慢请求&#xff0c;第一批慢请求响应时间在133…

完成UI界面的绘制

绘制UI 接上文&#xff0c;在Order90Canvas下创建Image子物体&#xff0c;图片资源ui_fish_lv1&#xff0c;设置锚点&#xff08;CountdownPanelImg同理&#xff09;&#xff0c;命名为LvPanelImg,创建Text子物体&#xff0c;边框宽高各50&#xff0c; &#xff0c;重名为LvT…

vue结合element-ui实现列表拖拽变化位置,点击拖动图标拖动整个列表元素,使用tsx格式编写

先来看下需要实现的效果 当鼠标放在左侧图标上时&#xff0c;可以拖动整个列表元素&#xff0c;调整顺序 思路介绍 使用draggable可以设置元素可拖动&#xff0c;然后分别设置三个事件处理函数&#xff0c;监听onDragstart、onDragover、onDragend三个事件 注意&#xff1a…