【HormonyOS4+NEXT】TypeScript基础语法详解

在这里插入图片描述

🙋‍ 一日之际在于晨
⭐本期内容:TypeScript基础语法详解
🏆系列专栏:鸿蒙HarmonyOS4+NEXT:探索未来智能生态新纪元


文章目录

  • 前言
  • 变量与类型
  • 函数
  • 类与接口
    • 类(Class)
    • 接口(Interface)
    • 函数与接口的使用
    • 对象的创建与函数的使用
  • 泛型
  • 总结


前言

TypeScript是一种由微软开发的开源编程语言,它是JavaScript的一个超集,添加了静态类型、类、接口和泛型等特性。这些特性使得TypeScript在大型项目中具有更好的可维护性和可扩展性。本文将对TypeScript的基础语法进行详细讲解,帮助读者快速入门。


变量与类型

TypeScript的核心特性之一就是静态类型系统。这意味着在声明变量时,我们可以为其指定一个类型,这样TypeScript编译器就可以在编译时检查类型错误。

例如:let msg:string=‘hello world’
其中:let为声明变量的关键字,const则代表常量, msg为变量名,是自定义的 string是变量的数据类型

常见的类型有:

  • string:字符串,可以用单引号或者双引号
let greeting: string = "Hello, World!";  
let quote: string = 'To be or not to be, that is the question.';
  • number:数值、整数、浮点数都可以
let age: number = 30;  
let price: number = 19.99;
  • any:不确定类型,可以是任意类型
let notSure: any = 4;  
notSure = "maybe a string instead";  
notSure = false;

- union:联合类型,可以是多个指定类型中的一种

let greet: string | number;  
greet = "Hello"; // OK  
greet = 42; // OK  
// greet = true; // Error, boolean is not string or number
  • Object:对象(注意:在TypeScript中,使用 {} 来表示一个空对象类型,而 Object 实际上指向的是非原始类型)
let person: object = {  name: "Alice",  age: 25  
};
  • Array:数组、元素可以是任意其他类型
let numbers: number[] = [1, 2, 3, 4, 5];  
let strings: string[] = ["red", "green", "blue"];  
let mixed: (number | string)[] = [1, "two", 3, "four"];

注意,对于 object 类型,实际上在TypeScript中,使用 {} 来定义一个空对象类型可能更加精确,因为它不会接受原始值(如 string、number 等)。而 Object 类型在TypeScript中是一个特殊的类型,它是所有类型的超类型,包括原始类型。因此,使用 Object 类型作为变量类型时,可以为其分配任何类型的值。

在定义数组时,我们通常使用类型后跟方括号的语法,例如 number[] 表示数字数组。如果需要数组中的元素可以是多种类型,可以使用联合类型,例如 (number | string)[] 表示数组中的元素可以是数字或字符串。

函数

在TypeScript中,我们可以为函数参数和返回值指定类型。这有助于我们在编写函数时明确函数的输入和输出,从而提高代码的可读性和可维护性。
如下,我们定义了一个名为greeter的函数,它接受一个string类型的参数person,并返回一个string类型的结果。然后,我们调用这个函数并传入一个字符串变量user作为参数。
注意:在TypeScript中,空字符串、数字0、null、undefined都被认为是false,其它值则为true。

function greeter(person: string): string {  return "Hello, " + person;  
}  let user = "Jane";  
console.log(greeter(user));

类与接口

在 TypeScript 中,类和接口是面向对象编程的两个核心概念。类(Class)是一种用户自定义的数据类型,它包含属性和方法,可以用来创建对象。接口(Interface)定义了一个对象的结构,它规定了一个对象应该有哪些属性和方法,但不提供具体的实现。

类(Class)

在这个 Animal 类中:
name 是一个属性,用来存储动物的名字。
constructor 是类的构造函数,用于创建类的实例,并初始化 name 属性。
move 是一个方法,用于描述动物移动的行为。注意,move 方法有一个默认参数 distanceInMeters,其默认值为 0。

class Animal {    name: string;  // 类的属性  constructor(theName: string) {  // 类的构造函数  this.name = theName;  // 在构造函数中初始化属性  }    move(distanceInMeters: number = 0) {  // 类的方法  console.log(`${this.name} moved ${distanceInMeters}m.`);    }    
}

接口(Interface)

Person 接口定义了一个对象应该具有 firstName 和 lastName 两个属性,并且这两个属性都是字符串类型。

interface Person {    firstName: string;  // 接口的属性  lastName: string;  // 接口的属性  
}

函数与接口的使用

greeter 函数接受一个参数 person,该参数的类型是 Person 接口。这意味着任何传递给 greeter 函数的对象都必须具有 firstName 和 lastName 属性。

function greeter(person: Person) {  // 函数接受一个符合Person接口的对象  return "Hello, " + person.firstName + " " + person.lastName;  // 使用接口的属性  
}

对象的创建与函数的使用

这里创建了一个对象 user,它符合 Person 接口的规范(即具有 firstName 和 lastName 属性)。然后,我们将 user 对象传递给 greeter 函数,并打印返回的问候字符串。

let user = { firstName: "Jane", lastName: "User" };  // 创建一个符合Person接口的对象  
console.log(greeter(user));  // 调用greeter函数并打印结果

泛型

在 TypeScript 中,泛型(Generics)是一种创建可重用组件的方式,这些组件可以处理多种数据类型,而不是单一的数据类型。泛型允许我们定义函数、接口或类,其中的类型参数可以在使用这些组件时指定。这使得代码更加灵活和可维护,因为我们可以编写一次代码,然后在多种数据类型上重复使用。

如下例子:identity 函数是一个泛型函数,它接受一个类型为 T 的参数,并返回相同类型的值。这里的 T 是一个类型参数,它代表了在函数被调用时可以指定的任意类型。
让我们详细分析一下这个代码:

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

在上面的代码中:

< T>:定义了类型参数 T。这告诉 TypeScript,我们打算在函数中使用一个或多个类型作为参数。
arg: T:函数参数 arg 的类型被指定为 T,意味着它可以是任何类型。
return arg;:函数返回与参数相同的值,其类型也是 T。
接着,创建了一个 myIdentity 变量,并将 identity 函数赋值给它。这里使用了另一种语法来指定泛型类型参数。

let myIdentity: <T>(arg: T) => T = identity;

这里,myIdentity 的类型被定义为接受一个类型为 T 的参数并返回相同类型的函数。它实际上是对 identity 函数的一个引用,因此我们可以通过 myIdentity 来调用 identity 函数。
最后使用 myIdentity 函数来处理不同类型的值:

console.log(myIdentity<string>("hello")); // 输出 "hello"  
console.log(myIdentity<number>(42)); // 输出 42

myIdentity< string>(“hello”):在这里,显式地指定了 T 为 string 类型,并传递了一个字符串 “hello” 作为参数。函数返回这个字符串,并输出到控制台。
myIdentity< number>(42):类似地,指定了 T 为 number 类型,并传递了一个数字 42。函数返回这个数字,并输出到控制台。


总结

今日之学习篇章已然落笔,愿诸君有所收获。🤩
倘若您对此深感兴趣,不妨关注此专栏,新知将持续涌现,与您共舞思维的华章。😎
期待下次再会,愿我们于知识的海洋中,再度相聚,共赏智慧之花绽放。👍
在这里插入图片描述

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

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

相关文章

Nginx常用配置,开箱即用

经常遇到Nginx安装和配置的问题。这里笔者将常用配置统统写在下面&#xff0c;方便咱们日常使用。这里本着开箱即用的原则&#xff0c;所以大多数时候不会解释为什么要这样去配置&#xff0c;也不涉及Nginx的安装步骤。下面的所有配置&#xff0c;都可以直接复制后粘贴使用&…

PTA L2-045 堆宝塔 (25 分)

堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下&#xff1a; 首先准备两根柱子&#xff0c;一根 A 柱串宝塔&#xff0c;一根 B 柱用于临时叠放。把第 1 块彩虹圈…

2024第二十一届五一数学建模A题思路 五一杯建模思路

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

Linux系统的引导过程与服务控制

目录 一、Linux操作系统引导过程 二、Linux系统服务控制 系统初始化进程 三、运行级别切换 *运行级别及切换 Linux系统的运行级别 四、优化开机自动加载服务 五、修复MBR扇区故障 一、Linux操作系统引导过程 主要步骤 开机自检&#xff1a; 检测硬件设备&#…

winform入门篇 第13章 菜单栏

菜单栏 本章内容 菜单栏 工具栏 右键菜单 重点是右键菜单的实现。 菜单栏 MenuStrip&#xff0c;支持可视化编辑 添加 MenuStrip 添加菜单、菜单项、分隔线给菜单项设置属性 —Name 字段名&#xff0c;Text 文本显示,Image:图标 给菜单项添加事件处理(双击即可) 1.添加菜单…

OSPF的P2P和Broadcast

OSPF为什么会有P2P和BROADCAST两种类型 OSPF&#xff08;开放最短路径优先&#xff09;协议中存在P2P&#xff08;点对点&#xff09;和BROADCAST&#xff08;广播多路访问&#xff09;两种网络类型&#xff0c;主要是为了适应不同类型的网络环境和需求。具体分析如下&#xf…

Jmeter 压测-Jprofiler定位接口相应时间长

1、环境准备 执行压测脚本&#xff0c;分析该接口tps很低&#xff0c;响应时间很长 高频接口在100ms以内&#xff0c;普通接口在200ms以内 2、JProfiler分析响应时间长的方法 ①JProfiler录制数据 压测脚本&#xff0c;执行1-3分钟即可 ②分析接口相应时间长的方法 通过Me…

Louvain算法简介

1. 背景 Louvain算法是一种基于图数据的社区发现算法(community detection)&#xff0c;算法的优化目标为最大化整个数据的模块度&#xff0c;模块度的计算如下&#xff1a; 其中m为图中边的总数量&#xff0c; 表示所有指向节点 i 的连边权重之和。 表示节点 i&#xff0c;j 之…

14_SpringMVC

文章目录 MVCSpringMVC与JavaEE对比SpringMVCSpringMVC的核心流程SpringMVC入门案例RequestMapping注解的使用Handler方法的返回值Handler方法的形参keyvalue形式的请求参数Json请求参数 RESTful风格接口静态资源处理FilterHandlerInterceptor异常处理SpringMVC核心流程流程图 …

sudo apt install ros-humble-gazebo-*显示网络不可达 Ubuntu20.04使用清华镜像本地安装/更新ros2

问题 sudo apt install ros-humble-gazebo-*显示网络不可达&#xff0c;这是因为sources.list中的镜像源有问题&#xff0c;换成清华源可以解决问题 解决 1 设置Ubuntu镜像源为清华镜像源 1.1 备份source.list文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.ba…

线圈、寄存器、存储区代号、功能码 案例说明

线圈和寄存器 表示数据类型 线圈&#xff1a;表示Boolean数据类型 寄存器&#xff1a;表示非Boolean数据类型&#xff0c;用来暂时存放参与运算的数据和运算结果&#xff0c;具有接收数据、存放数据和输出数据的功能。 ModbusRTU 读输出线圈 存储区代号 0区 功能码 0x01 读输入…

金牌客服的宝藏App——客服宝快捷回复软件

在客户服务领域&#xff0c;时间就是金钱&#xff0c;效率就是生命。作为一名荣获“金牌客服”称号的小编&#xff0c;我深知快捷回复工具对于提升工作效率和客户满意度的重要性。今天&#xff0c;我要向大家推荐一款在客服界小有名气的神器——客服宝聊天助手。这款快捷回复软…

2024.4.17

poll客户端 #include <myhead.h> #define IP "192.168.38.128" #define PORT 8889 int main(int argc, const char *argv[]) {//创建套接字int cfd socket(AF_INET,SOCK_STREAM,0);if(cfd -1){perror("cfd");return -1;}//绑定//......//连接服务…

C++动态内存管理 解剖new/delete详细讲解(operator new,operator delete)

讨厌抄我作业和不让我抄作业的人 讨厌插队和不让我插队的人 讨厌用我东西和不让我用东西的人 讨厌借我钱和不借给我钱的人 讨厌开车加塞和不让我加塞的人 讨厌内卷和打扰我内卷的人 一、C中动态内存管理 1.new和delete操作内置类型 2.new和delete操作自定义类型 二、operat…

重生奇迹mu恶魔来袭副本

在游戏重生奇迹mu中&#xff0c;恶魔来袭副本是玩家能够组队通过的副本。但是因为手游组队的不方便性&#xff0c;部分玩家对其还是非常苦手。而今天&#xff0c;我们就给大家讲解一下这个游戏的双人通关攻略。 1、挂机找怪手动输出 (1)对于普通剧情副本而言&#xff0c;挂机…

python爬虫原理和编程实战:爬取CSDN博主的账号信息

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

黑马点评(四) -- 分布式锁

1 . 分布式锁基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#xff0c;让…

4.1 返回JSON数据

1. 默认实现方式 JSON是目前主流的前后端数据传输方式&#xff0c;Spring MVC中使用消息转换器HttpMessageConverter对JSON的转换提供了很好的支持&#xff0c;在Spring Boot中更进一步&#xff0c;对相关配置做了更进一步的简化。 默认情况下&#xff0c;当开发者新创建一个S…

24.4.17 驱动开发定时器作业,消抖

定时器消抖工作原理 在按键按下之后&#xff0c;进入中断处理函数&#xff0c;在中断处理函数中&#xff0c;定时时间10ms当定时时间到&#xff0c;执行定时器处理函数&#xff0c;在定时器处理函数中&#xff0c;读取管脚的电平状态如果读到的是低电平&#xff0c;表示按键按下…

刷题日记——质因数的个数

题目 分析&#xff08;从质数的判断角度出发&#xff09;&#xff08;递归&#xff09; 判断n是否是质数需要&#xff1a; 遍历&#xff0c;i从2开始到sqrt(n)&#xff0c;每次判断n是否能整除i&#xff0c;若能则不是质数&#xff0c;若不能则是 思路&#xff1a; 先判断n…