鸿蒙harmony--TypeScript基础语法

把青春献给身后那座辉煌的都市,为了这个美梦我们付出着代价

目录

一,基础类型

二,数组

三,any

四,变量的类型注释

五,函数

5.1 参数类型注解

5.2 返回类型注解

5.3 匿名函数

六,对象类型

可选属性

七,联合类型

7.1 定义联合类型

7.2 使用联合类型

八,类型别名

九,接口

类型别名和接口的区别

十,类型断言

十一,null 和 undefined

非空断言运算符(后缀 !)

十二,枚举

数字枚举

字符串枚举

一,基础类型

TypeScript 有三个非常常用的基础类型:stringnumber 和 boolean

string 表示字符串值,如 "Hello, world"

number 代表数字。TypeScript 没有特殊的整数运行时值,因此没有相当于 int 或 float 的值 ,一切都只是 number

boolean 代表 true 和 false 这两个值

注意: StringNumber 和 Boolean(以大写字母开头)是合法的,但指的是一些很少出现在代码中的特殊内置类型。所以开发中我们一般使用 stringnumber 或 boolean 作为类型。

二,数组

数组的第一种写法:

numberArry:number[] =[1,2,3,4,5]
stringArry:string[] =["a","b","c","d"]
booleanArry:boolean[] = [true,false,true]

数组的第二中写法:

numberArry1:Array<number> =[1,2,3,4,5]
stringArry1:Array<string> =["a","b","c","d"]
booleanArry1:Array<boolean> = [true,false,true]

注意,[number] 是另一回事,不是数组

三,any

当一个值的类型为 any 时,你可以访问它的任何属性,像函数一样调用它,将它分配给任何类型的值,或者几乎任何其他东西这在语法上是合法的

obj:any = {
  a:1,
  b:"11"
}

注意:ArkTs已经不支持any

四,变量的类型注释

当使用 constvar 或 let 声明变量时,可以选择添加类型注释以显式指定变量的类型,也可以不用注释,因为TS会自动推断代码中的类型。

test(){
  let a:number = 1
  let b =2
  const c:string = "3"
  const d="4"
}

五,函数

5.1 参数类型注解

声明函数时,可以在每个参数后面加上类型注解,声明函数接受哪些类型的参数。参数类型注释在参数名称之后:

function test(name:string){
  console.log(name)
}

当参数具有类型注释时,将检查该函数的参数:

5.2 返回类型注解

可以添加返回类型注释。返回类型注释出现在参数列表之后:

function test(name:string):number{
  console.log(name)
  return 888
}

与变量类型注解非常相似,通常不需要返回类型注解,因为 TypeScript 会根据其 return 语句推断函数的返回类型。

返回Promise的函数:

async function test(name:string):Promise<number> {
  console.log(name)
  return 888
}

或者

function test1(name:string):Promise<number> {
  console.log(name)
  return new Promise((resolve, reject) => {
    if(name){
      resolve(999)
    }else {
      reject(888)
    }
  })
}

5.3 匿名函数

匿名函数与函数声明有点不同。当一个函数出现在 TypeScript 可以确定如何调用它的地方时,该函数的参数会自动被赋予类型。

const names = ["Alice", "Bob", "Eve"];
names.forEach(function (s) {
  console.log(s.toUpperCase());
});

即使参数 s 没有类型注释,TypeScript 还是使用 forEach 函数的类型以及推断的数组类型来确定 s 将具有的类型。这个过程称为上下文类型,因为函数发生的上下文告知它应该具有什么类型。

或者

export default class TsTest {
  numberArry:number[] =[1,2,3,4,5]
  
  method(){
    this.numberArry.forEach((item,index)=>{
    })
  }
}

六,对象类型

要定义对象类型,我们只需列出其属性及其类型。

function duixiang(obj:{x:number,y:number}){
  console.log(obj.x+obj.y+"")
}

可选属性

对象类型还可以指定它们的部分或全部属性是可选的。为此,请在属性名称后添加 ?

function duixiang(obj:{x:number,y?:number}){
  console.log(obj.x+obj.y+"")
}
method(){
  duixiang({x:1})
  duixiang({x:1,y:2})
}

七,联合类型

7.1 定义联合类型

联合类型是由两种或多种其他类型组成的类型,表示可能是这些类型中的任何一种的值。我们将这些类型中的每一种都称为联合的成员。

export default class TsTest {
 
  name:string | number
  
  union(){
    this.name = 1 //ok
    this.name = "11" //ok
    this.name= false //Type 'boolean' is not assignable to type 'string | number'. <ArkTSCheck>
  }
 
}

7.2 使用联合类型

TypeScript 只有在对联合的每个成员都有效的情况下才允许操作。例如,如果你有联合 string | number,则不能使用仅在 string 上可用的方法:

union(){
  this.name.toUpperCase()//Property 'toUpperCase' does not exist on type 'string | number'. Property 'toUpperCase' does not exist on type 'number'
}

解决方案是用代码缩小联合,就像在没有类型注释的 JavaScript 中一样。当 TypeScript 可以根据代码的结构为某个值推断出更具体的类型时,就会发生缩小。

union(){
  if(typeof this.name === "string"){
    console.log(this.name.toUpperCase())//ok
  }else {
    this.name++   //ok
  }
}

八,类型别名

我们一直通过直接在类型注释中编写对象类型和联合类型来使用它们。这很方便,但通常希望多次使用同一个类型并用一个名称引用它。

type YuanZhen = {
  name:string;
  age:number;
}
export default class TsTest {
  union(yuan:YuanZhen){
    yuan.name="袁震"
    yuan.age=30
  }

}

可以使用类型别名来为任何类型命名,而不仅仅是对象类型。例如,类型别名可以命名联合类型:

type Yuan= number | string | boolean

九,接口

接口声明是命名对象类型的另一种方式:

interface Point {
  x: number;
  y: number;
}
 
function printCoord(pt: Point) {
  console.log("The coordinate's x value is " + pt.x);
  console.log("The coordinate's y value is " + pt.y);
}
 
printCoord({ x: 100, y: 100 });

就像我们在上面使用类型别名时一样,该示例就像我们使用匿名对象类型一样工作。TypeScript 只关心我们传递给 printCoord 的值的结构 - 它只关心它是否具有预期的属性。只关心类型的结构和功能是我们称 TypeScript 为结构类型类型系统的原因。

类型别名和接口的区别

类型别名和接口非常相似,在很多情况下你可以在它们之间自由选择。interface 的几乎所有功能都在 type 中可用,主要区别在于无法重新打开类型以添加​​新属性,而接口始终可扩展。

扩展接口:

interface Animal {
name: string;
}

interface Bear extends Animal {
honey: boolean;
}

const bear = getBear();
bear.name;
bear.honey;

通过交叉扩展类型:

type Animal = {
name: string;
}

type Bear = Animal & {
honey: boolean;
}

const bear = getBear();
bear.name;
bear.honey;

十,类型断言

有时你会得到关于 TypeScript 无法知道的值类型的信息。

例如,如果你使用的是 document.getElementById,TypeScript 只知道这将返回某种 HTMLElement,但你可能知道你的页面将始终具有具有给定 ID 的 HTMLCanvasElement

在这种情况下,你可以使用类型断言来指定更具体的类型:

const myCanvas = document.getElementById("main_canvas") as HTMLCanvasElement;

与类型注释一样,类型断言被编译器删除,不会影响代码的运行时行为。

const myCanvas = <HTMLCanvasElement>document.getElementById("main_canvas");

十一,nullundefined

JavaScript 有两个基础值用于表示值不存在或未初始化的值:null 和 undefined

当值为 null 或 undefined 时,需要在对该值使用方法或属性之前测试这些值。就像在使用可选属性之前检查 undefined 一样,可以使用缩小来检查可能是 null 的值:

function doSomething(x: string | null) {
  if (x === null) {
    // do nothing
  } else {
    console.log("Hello, " + x.toUpperCase());
  }
}

非空断言运算符(后缀 !

TypeScript 还具有一种特殊的语法,可以在不进行任何显式检查的情况下从类型中删除 null 和 undefined。在任何表达式之后写 ! 实际上是一个类型断言,该值不是 null 或 undefined

function liveDangerously(x?: number | null) {
  // No error
  console.log(x!.toFixed());
}

就像其他类型断言一样,这不会改变代码的运行时行为,所以当你知道值不能是 null 或 undefined 时,只使用 ! 很重要。

十二,枚举

枚举允许开发者定义一组命名常量。使用枚举可以更轻松地记录意图,或创建一组不同的案例。TypeScript 提供基于数字和基于字符串的枚举。

数字枚举

可以使用 enum 关键字定义枚举。

enum Direction {
  Up = 1,
  Down,
  Left,
  Right,
}

上面,我们有一个数字枚举,其中 Up 用 1 初始化。从那时起,以下所有成员都会自动递增。换句话说,Direction.Up 的值为 1Down 的值为 2Left 的值为 3Right 的值为 4

或者:

enum Direction {
  Up,
  Down,
  Left,
  Right,
}

在这里,Up 的值为 0Down 的值为 1,以此类推。这种自动递增行为对于我们可能不关心成员值本身但要注意每个值与同一个中的其他值不同的情况很有用枚举。

字符串枚举

在字符串枚举中,每个成员都必须使用字符串字面或另一个字符串枚举成员进行常量初始化。

enum Direction {
  Up = "UP",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT",
}

虽然字符串枚举没有自动递增行为,但字符串枚举的好处是它们 “serialize” 很好。换句话说,如果你正在调试并且必须读取数字枚举的运行时值,则该值通常是不透明的 - 它本身并没有传达任何有用的含义

字符串枚举允许你在代码运行时提供有意义且可读的值,而与枚举成员本身的名称无关。

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

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

相关文章

整数对最小和 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给定两个整数数组array1、array2&#xff0c;数组元素按升序排列。 假设从array1、array2中分别取出一个元素可构成一对元素&#xff0c;现在需要取出k对元素&am…

【Java的基本数据类型及其占用内存大小和默认值】

Java的基本数据类型及其占用内存大小和默认值 Java的基本数据类型包括以下几种&#xff1a; byte&#xff08;字节型&#xff09;&#xff1a;占用1个字节&#xff0c;取值范围是-128到127&#xff0c;默认值为0。short&#xff08;短整型&#xff09;&#xff1a;占用2个字节&…

【LeetCode每日一题】1109. 航班预订统计1094. 拼车 (差分数组)

差分数组 差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减。 一、基本概念&#xff1a; 差分数组的定义如下&#xff1a; 假设原始数组为arr&#xff0c;差分数组为diff&#xff0c;其中diff[i] arr[i] - arr[i-1]&#xff08;0 < i < n&#xff0…

Ubuntu-22.04上ToDest设置开机不弹出图形界面

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、开始操作1.设置图形端 总结 前言 有时候远程成为开发必不可少的工具&#xff0c;目前国内有很多相关的软件&#xff0c;比较有名的是向日葵、ToDesk、Rust…

美团面试:Sentinel底层滑动时间窗限流算法怎么实现的?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 问题1&#xff1a;Sentinel高可用熔断降级&#xff0c;是如何…

2023年06月CCF-GESP编程能力等级认证Python编程四级真题解析

一、单选题(共15题,共30分) 第1题 高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。 A:编辑 B:保存 C:调试 D:编译 答案:D 第2题 排序算法是稳定的(Stable Sorting),就是指排序算法可以保证,在待排序数据中有两个相等记录的关…

GPT-5的功能界面曝光。。。

最近网络上流传的照片是否真实尚不可知&#xff0c;我们需要进一步的核实与分析。 GPT-5的预期发布已经引起了业界的极大关注。根据Roemmele的透露&#xff0c;GPT-5将是一个革命性的多模态模型&#xff0c;能够支持语音、图像、编程代码和视频等多种格式&#xff0c;这标志着…

C++关键词auto详解

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、小思考 随着我们对于C的不断学习&#xff0c;遇到的程序越来越复杂&#xff0c;程序中用到的类型也越来越复杂…

《高性能MySQL》

文章目录 一、创建1. 磁盘1.1 页、扇区、寻道、寻址、硬盘性能 2. 行结构row_format2.1 Compact紧凑2.1.1 行溢出2.1.2 作用2.1.3 内容1-额外信息1、变长字段长度2、NULL值列表3、记录头信息 2.1.4 内容2-真实数据4、表中列的值5、transaction_id6、roll_point7、row_id 2.2 dy…

RAG Fusion简明教程

随着 NLP 和生成 AI 领域的最新进展&#xff0c;RAG&#xff08;检索增强生成&#xff09;的引入有望通过结合基于检索的模型和序列到序列的强大功能&#xff0c;对 BERT Chat GPT 等现有技术进行改进。 架构。 RAG 是一个人工智能框架&#xff0c;旨在通过建立外部知识源模型来…

SpringBoot+Redis如何实现用户输入错误密码后限制登录(含源码)

点击下载《SpringBootRedis如何实现用户输入错误密码后限制登录&#xff08;含源码&#xff09;》 1. 引言 在当今的网络环境中&#xff0c;保障用户账户的安全性是非常重要的。为了防止暴力破解和恶意攻击&#xff0c;我们需要在用户尝试登录失败一定次数后限制其登录。这不…

Python武器库开发-武器库篇之FTP服务暴力破解(五十三)

Python武器库开发-武器库篇之FTP服务暴力破解(五十三) FTP (File Transfer Protocol) 是一种用于在网络上传输文件的协议。它允许用户通过一个客户端应用程序连接到远程服务器&#xff0c;并通过该服务器传输文件。FTP 服务是在互联网上广泛使用的一种服务&#xff0c;它使用户…

postman用法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、postman怎么使用json输出 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0…

人工智能时代:AI提示工程的奥秘 —— 驾驭大语言模型的秘密武器

文章目录 一、引言二、提示工程与大语言模型三、大语言模型的应用实践四、策略与技巧五、结语《AI提示工程实战&#xff1a;从零开始利用提示工程学习应用大语言模型》亮点内容简介作者简介目录获取方式 一、引言 随着人工智能技术的飞速发展&#xff0c;大语言模型作为一种新…

如何在FBX剔除Lit.shader依赖

1&#xff09;如何在FBX剔除Lit.shader依赖 2&#xff09;Unity出AAB包&#xff08;PlayAssetDelivery&#xff09;模式下加载资源过慢问题 3&#xff09;如何在URP中正确打出Shader变体 4&#xff09;XLua打包Lua文件粒度问题 这是第371篇UWA技术知识分享的推送&#xff0c;精…

VueFire:一个一流的 Vue 和 Firebase 体验,包括对 Nuxt 的支持,现在已经稳定了

VueFire&#xff0c;一个一流的 Vue 和 Firebase 体验 — 包括对 Nuxt 的支持&#xff0c;现在已经稳定了。 Vue 和 Firebase 现在比以往任何时候都更好了。 构建更好的VueFire 去年&#xff0c;我们宣布与 Eduardo San Martin Morote 合作&#xff0c;构建一个成熟的 Vue 和…

算法面试八股文『 基础知识篇 』

博客介绍 近期在准备算法面试&#xff0c;网上信息杂乱不规整&#xff0c;出于强迫症就自己整理了算法面试常出现的考题。独乐乐不如众乐乐&#xff0c;与其奖励自己&#xff0c;不如大家一起嗨。以下整理的内容可能有不足之处&#xff0c;欢迎大佬一起讨论。 PS&#xff1a;…

前端封装websocket类,实现消息注册和全局回调

实现消息注册和回调函数&#xff0c;实现全局使用同一个webscoket对象&#xff0c;并实现断线重连和心跳连接等功能&#xff0c;可以实现全局使用唯一实例&#xff0c;可以另外进行拓展配置 // WebSocket类对象 class WebSocketCli {// 构造函数constructor(url: string, opts…

Android悬浮窗实现步骤

最近想做一个悬浮窗秒表的功能&#xff0c;所以看下悬浮窗具体的实现步骤 1、初识WindowManager 实现悬浮窗主要用到的是WindowManager SystemService(Context.WINDOW_SERVICE) public interface WindowManager extends ViewManager {... }WindowManager是接口类&#xff0c…

如何判断 LM358 芯片是否损坏或故障?

LM358 芯片是一种流行的低功耗双运放&#xff0c;广泛应用于各种电子电路中&#xff0c;包括放大器、滤波器、积分器、比较器等。它以其低成本、高性价比和广泛的工作电源范围&#xff08;3V至32V单电源或1.5V至16V双电源&#xff09;而被广泛使用。 然而&#xff0c;像所有电…