TypeScript学习(基础篇)

news2024/11/21 0:18:21

前言

在现代的Web开发生态系统中,JavaScript已经成为一种必备的技术。然而,随着应用的增大,JavaScript的一些限制开始显现,例如缺乏静态类型检查和编译时错误检查。这正是TypeScript发挥作用的地方,TypeScript是一种静态类型的编程语言,它是JavaScript的超集。其优于JavaScript最大的两个优势就是提供可选的强静态类型和更为完善的面向对象特性。

TypeScript引入了类型系统,这也是其最大优势,静态类型系统可以在编译时捕获类型错误,提供更早的错误检测和更好的代码健壮性,这意味着你可以在编码阶段就发现变量类型、函数参数和返回值类型等错误,而不是在运行时。这大大提高了代码的可维护性和可读性,帮助开发人员在开发过程中发现潜在的错误,本文为就来给大家讲解TypeScript的数据类型。

1. 变量的声明

变量声明语法:let  变量名[ : 变量类型 ] = 值 

let var_name[:var_type [| var_type2 | var_type3]] = value

2. 原始数据类型

// 字符串类型
let username:string = "xujingliang";

// 数字类型
let age:number = 25;

// 布尔类型
let isShow:boolean = true;

// 未定义
let defined:undefined = undefined;

// 空
let empty:null = null;

3. 任意类型:any

任意值(Any)用来表示允许赋值为任意类型。

1. 如果是一个普通类型,在赋值过程中改变类型是不被允许的,但如果是 any 类型,则允许被赋值为任意类型。

// 定义一个变量被声明为string类型
let username:string = "hello world";

// 给刚刚声明的变量赋值number时,类型检查报错
username = 20

// 类型报错内容:Type 'number' is not assignable to type 'string'.(2322)

// 定义一个变量被声明为any任意类型
let username:any = "xujingliang";

// 给刚刚声明的变量赋值number时,类型检查不会报错
username = 123456

2. 变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型。例如:

let username;
username="xujingliang";
username = 123456;

使用any类型的弊端:一夜回到解放前吧 everthing is any,ts 基本就是 js

4. 类型推论

如果没有明确的指定类型,那么 TypeScript 会依照类型推论(Type Inference)的规则推断出一个类型。

以下代码虽然没有指定类型,但是会在编译的时候报错,原因是如果没有明确规定数据类型,TS会推断数据类型为首次赋值的类型。

let myFavoriteNumber = 'seven';
myFavoriteNumber = 7;

// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.

上面这段代码就等同于:

let myFavoriteNumber: string = 'seven';
myFavoriteNumber = 7;

// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.

 TypeScript 会在没有明确的指定类型的时候推测出一个类型,这就是类型推论。类型推论常见情况:

1. 如果定义变量后第一次赋值为某一类型,在以后的操作中ts会推断为首次赋值的这一类型。

2. 如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查:

5. 联合类型

联合类型(Union Types)表示取值可以为多种类型中的一种。

1. 定义一个变量result用于接收后端接口返回的结果,但是返回的结果可能是数字、字符串或布尔,就可以使用联合类型类定义一个变量,例如:

let result:number | string | boolean;

result = 200;

result = "操作成功";

result = true;

 联合类型使用 “ | ” 分隔每个类型。

2. 当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法。

3. 联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型:

let result:number | string | boolean;

result = 20;

result.split(",")

// 会检查报错:Property 'split' does not exist on type 'number'.(2339)

上述代码中,第一次赋值为number类型,TS会推断为number类型,则使用字符串处理函数split会出现检查报错。

6. 对象的类型接口

在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型。

在面向对象语言中,接口(Interfaces)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement)。

TypeScript 中的接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象以外,也常用于对「对象的形状(Shape)」进行描述。

// 接口
interface Person{
    readonly id:string;    // 只读属性
    name:string;
    age:number;
    sex?:number;           // 可选属性
    [password:number]:number     //  任意属性
}

let p:Person = {
    id:"48280240820",
    name:"xujingliang",
    age:20,
}

console.log(p);

7. 数组的类型

 在 TypeScript 中,数组类型有多种定义方式,比较灵活。

1. 最简单的方法是使用「类型 + 方括号」来表示数组

let users:string[] = ["xiaoming","zhagnchao","wangwei","yangwei"]

注意:数组赋值时数组的项中不允许出现其他的类型。

let users:string[] = ["xiaoming",9527,"wangwei","yangwei"]

// 在字符串数组中添加了一个数字类型值时报错:Type 'number' is not assignable to type 'string'

注意:数组的一些方法的参数也会根据数组在定义时约定的类型进行限制。

let users:string[] = ["xiaoming","wangpeng","wangwei","yangwei"]

user.push(9527)

// 语法检查报错:Argument of type 'number' is not assignable to parameter of type 'string'.(2345)

上例中,push 方法只允许传入 number 类型的参数,但是却传了一个 "8" 类型的参数,所以报错了。

2. 数组泛型

3. any 在数组中的应用

一个比较常见的做法是,用 any 表示数组中允许出现任意类型,可以实现数组中可以存放多种类型的数据

let list: any[] = ['xcatliu', 25, { website: 'http://xcatliu.com' }];

8. 函数的类型 

1. 在JavaScript中声明函数如下:

let users = ["喜洋洋","懒洋洋","沸羊羊"];

function getName(index){
    return users[index];
}

getName(0);

 一个函数有输入和输出,要在 TypeScript 中对其进行约束,需要把输入和输出都考虑到,其中函数声明的类型定义较简单。

let users:string[] = ["喜洋洋","懒洋洋","沸羊羊"];

function getName(index:number):string{
    return users[index];
}

getName(0);

注意:注意,输入多余的(或者少于要求的)参数,是不被允许的,

Expected 1 arguments, but got 3.

 2. 用接口定义函数的形状

interface myFun{
    (name:string,age:number):string;
}

let myFunction:myFun;

myFunction = function(name:string,age:number):string{
    return "My name is "+name+"and I am "+age
}

采用函数表达式|接口定义函数的方式时,对等号左侧进行类型限制,可以保证以后对函数名赋值时保证参数个数、参数类型、返回值类型不变。 

3. 可选参数

前面提到,输入多余的(或者少于要求的)参数,是不允许的。那么如何定义可选的参数呢?

与接口中的可选属性类似,我们用 ? 表示可选的参数:

function buildName(firstName: string, lastName?: string) {
    if (lastName) {
        return firstName + ' ' + lastName;
    } else {
        return firstName;
    }
}
let tomcat = buildName('Tom', 'Cat');
let tom = buildName('Tom');

注意:需要注意的是,可选参数必须接在必需参数后面。换句话说,可选参数后面不允许再出现必需参数了: 

4.参数默认值

在 ES6 中,我们允许给函数的参数添加默认值,TypeScript 会将添加了默认值的参数识别为可选参数

function buildName(firstName: string, lastName: string = 'Cat') {
    return firstName + ' ' + lastName;
}
let tomcat = buildName('Tom', 'Cat');
let tom = buildName('Tom');

 5. 剩余参数

ES6 中,可以使用 ...rest 的方式获取函数中的剩余参数(rest 参数):

// 参数默认值 
function say(name:string,age:number,...items:any[]):void{
    
    console.log(name,age,items);
}

say("xujingliang",25,20,20,20,20);

// 输出结果:"xujingliang",  25,  [20, 20, 20, 20] 

注意,rest 参数只能是最后一个参数,关于 rest 参数,可以参考 

9. 类型断言

类型断言(Type Assertion)可以用来手动指定一个值的类型。

使用 as 关键字,来强制指定一个类型。

class Animal{
    
}

class Cat extends Animal{
    public miao():void{
        console.log("喵喵喵");
    }
}

class Dog extends Animal{
    public wang():void{
        console.log("汪汪汪");
    }
}


function test(animal:Cat|Dog):void{
    // animal.miao() 报错

    (animal as Cat).miao();
}

上述代码代码中如果animal是传入的Dog类,则调用miao()方法会报错,可以使用 as 将类型强制转为Cat类,然后调用miao()方法。

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

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

相关文章

软件测试自学还是报班好?

如果你学软件测试,是以就业为目的,而且是以高薪就业为目的,那我们就要去反推,为了这个目标,我们要去做什么事情。 为了“将高薪就业为目的,我们要做什么事情”阐述清楚,本文行文结构如下&#x…

接口测试及常用接口测试工具(postman/jmeter)附教程

首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给…

Netty—Reactor线程模型详解

文章目录 前言线程模型基本介绍线程模型分类Reactor线程模型介绍Netty线程模型: 传统阻塞IO的缺点Reactor线程模型单Reactor单线程模式单Reactor多线程模式主从Reactor多线程Reactor 模式小结 Netty 线程模型案例说明:Netty核心组件简介ChannelPipeline与…

条件覆盖和条件组合覆盖测试设计-实验八例题

目录 条件覆盖 判定-条件覆盖 条件组合覆盖 实验内容: 以银行内部转账为实例,针对内部转账业务逻辑代码进行分析,运用条件覆盖和条件组合覆盖进行测试用例设计。 实验过程: 条件覆盖 条件覆盖(Condition Cover…

官宣定了!2024年举办4次PMP认证考试,每个季度一次

就在刚刚,2023年12月26日14:05分,PMI和中国国际人才交流基金会通过官微,联合发布了2024年PMI认证考试计划的通知,正式宣告了2024年的PMP考试初步安排。 这个通知发布之后,有一些伙伴问华研荟一些细节问题,…

挑战Python100题(6)

100+ Python challenging programming exercises 6 Question 51 Define a class named American and its subclass NewYorker. Hints: Use class Subclass(ParentClass) to define a subclass. 定义一个名为American的类及其子类NewYorker。 提示:使用class Subclass(Paren…

vue-awesome-swiper轮播组件

安装版本&#xff1a;"swiper": "^6.0.0", 安装版本&#xff1a;"vue-awesome-swiper": "^4.1.1", <div class"swiper_conter"><swiper class"swiper" :options"swiperOption" ref"mySw…

怎么实现Servlet的自动加载

在实际开发时&#xff0c;有时候会希望某些Servlet程序可以在Tomcat启动时随即启动。但在默认情况下&#xff0c;第一次访问servlet的时候&#xff0c;才创建servlet对象。 如果servlet构造函数里面的代码或者init方法里面的代码比较多&#xff0c;就会导致用户第一次访问serv…

浅谈能效管理平台在污水处理厂中的应用

摘要&#xff1a;《“十四五”城镇污水处理及资源化利用发展规划》指出&#xff0c;2021—2025 年合理减缓我国城镇污水收集处理设施发展不平衡不充分的矛盾&#xff0c;系统推动补短板强弱项&#xff0c;全方面提升污水收集处理效能&#xff0c;加速推进污水资源化利用&#x…

溴乙腈,2028年将以4.5%左右的复合年增长率增长

溴乙腈是一种化合物&#xff0c;主要用作合成各种药物、农用化学品和其他特种化学品的中间体。近年来&#xff0c;受医疗保健、农业和化学制造等各种最终用途行业对溴乙腈的需求不断增加的推动&#xff0c;全球溴乙腈市场一直在稳步增长。全球市场分析&#xff1a; 在制药和农业…

【Unity地形】使用地形工具创建场景环境-Terrain

如上图Unity的地形工具可以让我们实现创建复杂、丰富的3D室外环境。 我们创建地形很简单&#xff0c;在层级面板中右键-3Dobject-Terrain 就可以创建一个默认的地形模型&#xff01;这个模型是Unity内置的。 接下来的地形编辑功能全部集中在这个地形的组件上 主要功能如下&…

怎么修复MSVCR110.dll文件?全面解析MSVCR110.dll缺失修复方法

MSVCR110.dll文件缺失问题在Windows操作系统用户中相当普遍&#xff0c;经常导致应用程序启动失败或崩溃。MSVCR110.dll是Microsoft Visual C Redistributable for Visual Studio 2012的一部分&#xff0c;且应用程序通常依赖这个DLL文件来执行C库中的代码。文件的丢失可能源自…

Rabbit加密算法

一、引言 随着信息技术的快速发展&#xff0c;数据安全已成为越来越受到重视的领域。加密算法作为保障数据安全的重要技术手段&#xff0c;在通信、存储等领域得到了广泛应用。Rabbit加密算法作为一种新型的加密算法&#xff0c;凭借其简单易懂的原理、高速的运算性能以及良好…

isEmpty 和 isBlank 的用法区别,居然一半的人答不上来.....

亲爱的小伙伴们&#xff0c;由于微信公众号改版&#xff0c;打乱了发布时间&#xff0c;为了保证大家可以及时收到文章的推送&#xff0c;可以点击上方蓝字关注测试工程师成长之路&#xff0c;并设为星标就可以第一时间收到推送哦&#xff01; 也许你两个都不知道,也许你除了is…

MuJava提供的方法级别的7类变异算子总结

MuJava简洁 Java (muJava) 是 Java 程序的变异系统。 它自动生成用于传统突变测试和类级别突变测试的突变体。 Java 可以测试单个类和多个类的包。 用户以对封装在单独 JUnit 类的方法中的被测类的方法调用序列的形式提供测试。 官网地址&#xff1a;Java Home Page 归档表格…

【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; Mybatis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 一、概述 MyBatis简介 主要特性 1. 动态SQL 2.结果映射 3 .插件机制 二、MyBatis配置文件 1.配置文件结构 数据库连…

力扣-收集足够苹果的最小花园周长[思维+组合数]

题目链接 题意&#xff1a; 给你一个用无限二维网格表示的花园&#xff0c;每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| |j| 个苹果。 你将会买下正中心坐标是 (0, 0) 的一块 正方形土地 &#xff0c;且每条边都与两条坐标轴之一平行。 给你一个整…

labelme目标检测数据类型转换

1. labelme数据类型 LabelMe是一个开源的在线图像标注工具&#xff0c;旨在帮助用户创建和标记图像数据集。它提供了一个用户友好的界面&#xff0c;让用户可以直观地在图像上绘制标记框、多边形、线条等&#xff0c;以标识和注释图像中的对象或区域。 GitHub&#xff1a;http…

[linux]高级IO

文章目录 高级IO0. IO介绍1. 五种IO模型1.0 感性理解(故事版)1.1 阻塞IO1.2 非阻塞IO1.3 信号驱动IO1.4 IO多路转接1.5 异步IO 2. 高级IO重要概念2.1 同步通信 vs 异步通信2.2 阻塞 vs 非阻塞 3. 其他高级IO4. 非阻塞IO4.1 fcntl4.2 实现函数SetNoBlock4.2.0 阻塞方式读取标准输…

Shell 脚本应用(四)

正则表达式概述 正则表达式又称正规表达式&#xff0c;常规表达式。在代码中常简写为regex&#xff0c;regexp 或RE.正则表达式 是使用单个字符串来描述&#xff0c;匹配一系列符合某个句法规则的字符串&#xff0c;简单来说&#xff0c;是一种匹配字符串 的方法&#xff0c;通…