手拉手带你掌握TS数据类型

2024-02-27 07:20

本文主要是介绍手拉手带你掌握TS数据类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

TS为什么会出现呢?Coderwhy老师说的一句话我非常赞同 – 任何新技术的出现都是为了解决原有技术的某个痛点。那TS的出现是为了解决什么呢?答案当然是为了解决JS的缺陷,我们知道JS有不少的缺陷,例如:

  • ES5以及之前的使用var关键字关于作用域的问题
  • 最初JS设计的数组类型并不是连续的内存空间
  • 直到今天JS也没有加入类型检测这一机制
    而TS的出现就是解决JS的这些痛点的。
    那什么是TS呢?我们来看一下 TypeScript在GitHub GitHub 和 官方上对自己的定义:
  • GitHub 说法: TypeScript is a superset of JavaScript that compiles to clean TypeScript output
  • TypeScript 官网: TypeScript is a typed superset of JavaScript that compiles to plain JavaScript
    翻译一下: TypeScript 是拥有类型的JavaScript 超集 ,它可以编译成普通、干净、完整的JavaScript 代码

怎么理解上面的话呢?

  • 我们可以将TypeScript 理解成加强版的JavaScript
  • JavaScript 所拥有的特性,TypeScript 全部都是支持的 ,并且它紧随ECMAScript 的标准,所以 ES6 、ES7 、ES8等新语法标准,它都是支持的
  • TypeScript 在实现新特性的同时总是保持和 ES 标准的同步甚至是领先
  • 并且在语言层面上, 不仅增加了类型约束,而且包括一些语法的扩展比如枚举( Enum )、元组类型( TupleTuple )等 ;
  • 并且TypeScript 最终会被编译成JavaScript代码 ,所以你并不需要担心它的兼容性问题在编译时也可以借助于 Babel这样的工具

所以,我们可把TypeScript 理解成更加强大的JavaScript ,不仅让JavaScript更加安全,而且给他带来了诸多的好用特性。
这里有一张图可以更加直观的带你理解JS和TS的关系
在这里插入图片描述

TS数据类型

接下来进入到本篇文章的正题,这部分将从两方面着手讲述:

  1. TS和JS共有的数据类型
  2. TS独有的数据类型

需要说明一点的就是TS中声明的数据类型要注意大小写的区别。 例如,你想要定义一个数字类型的变量: 要写成 let num: number = 3不是 let num: Number = 3;虽然第二种写法从语法上来说也没有问题,但是Number并不是TS的基本数据类型,他是数字类型的包装类,而诸如 ‘number’ ,‘object’, ‘boolean’, ‘string’ 等才是TS的基本数据类型。
接下来就分别来讲述吧

TS和JS共有的数据类型

说明: 单独的 export {} 并不需要导出任何东西,但它会告诉TS编译器这个文件是一个模块,不是一个全局文件从而,在另一个文件中定义相同的变量不会产生命名冲突

number
let num: number = 3
console.log(num)export {}
boolean
let bool: boolean = true
console.log(bool)export {}
string
let str: string= 'string'
console.log(str)export {}
Array

TS中数组定义有两种方式,一种是常规写法,另一种是泛型写法

// 常规写法
let arr1: string[] = ['a', 'b']
// 泛型写法
let arr2: Array<number> = [1,3,2]export {}
Object

这个例子用到了类型声明type,具体可以看我的另一篇文章

type InfoType = {name: 'string',age: number
}let info: InfoType = {name: 'Machigen',age: 21
}export {}

object类型可以用来描述一个对象:

const info: object = {name: 'wanger',age: 21
}// 下面的代码有问题
info['name'] = 'Q'
console.log(info.age)export {}

但是这种定义方式导致定义的对象为空对象类型,所以,不能获取数据,也不能设置数据。 例如,上面的代码会报错。
在这里插入图片描述

Symbol

可以通过 symbol来定义相同的名称,因为Symbol函数返回的是不同值:

const s1: symbol = Symbol('name')
const s2: symbol = Symbol('name')const person = {[s1]: 'Lee',[s2]: 'Jay'
}export {}
null 和 undefined

在TS中,这两个类型和值等同

let n: null = null
let un: undefined = undefinedexport {}
函数
function foo(num: number): string {return 'I am number ' + num
}
foo(3)// 匿名函数不建议指定类型
const names: string[] = ['Lee', 'Kobe']
names.forEach((item, index, arr) => {console.log(item, index, arr)
})export {}

匿名函数不建议指定类型 , 如上例,TS会根据forEach函数的类型推断出item,index和arr的类型这个过程称之为上下文类型,因为函数的上下文可以帮助确定参数和返回值的类型。

对象类型
type PointType = {x: number,y: number
}function getCoordinate(point: PointType) {console.log('坐标是:(' + point.x + ',' + point.y + ')')
}
getCoordinate({ x: 2, y: 1})export {}
可选类型

对象类型也可以指定哪些类型是可选的,可以在属性的后面加一个?:

type PointType = {x: number,y: number,z?: number
}function getCoordinate(point: PointType) {console.log('坐标是:(' + point.x + ',' + point.y + ')')if(point.z)console.log('z轴是:', point.z)
}
getCoordinate({ x: 2, y: 1})
getCoordinate({ x: 2, y: 1, z: 3})export {}

TS独有的数据类型

any

使用any类型,也就间接的把TS当成JS来用了

let a: any = 123
a = 'str'
a = {}export {}
unknown

unknown 是TypeScript中比较特殊的一种类型,它用于描述不确定的变量。和any 类型有点似,但是 unknown 类型的值上做任何事情都是不合法的,必须进行类型缩小才能进一步操作

function foo(): string {return 'foo'
}function bar(): number {return 123
}const flag = true
const result: unknown;
if(flag) {result = foo()
} else {result = bar()
}// unknown类型默认情况下在上面进行任意的操作都是非法的
// 要求必须进行类型的校验(缩小)
// 才能根据缩小之后的类型, 进行对应的操作
if (typeof result === "string") { // 类型缩小console.log(result.length, result.split(" "))
}// 直接输出下面的代码会报错
console.log(result.length, result.split(" "))export {}
void
// 1.在TS中如果一个函数没有任何的返回值, 那么返回值的类型就是void类型
// 2.如果返回值是void类型,
// 那么我们也可以返回undefined(TS编译器允许这样做而已)
function sum(num1: number, num2: number): void {console.log(num1 + num2)// return 123 错误的做法
}// 应用场景: 用来指定函数类型的返回值是void
type LyricInfoType = { time: number, text: string }
// parseLyric函数的数据类型: (lyric: string) => LyricInfoType[]
function parseLyric(lyric: string): LyricInfoType[] {const lyricInfos: LyricInfoType[] = []// 解析return lyricInfos
}// parseLyric => 函数/对象
type FooType = () => void
const foo: FooType = () => {}// 1.定义要求传入的函数的类型
type ExecFnType = (...args: any[]) => void// 2.定义一个函数, 并且接收的参数也是一个函数
// 而且这个函数的类型必须是ExecFnType
function delayExecFn(fn: ExecFnType) {setTimeout(() => {fn("why", 18)}, 1000);
}// 3.执行上面函数, 并且传入一个匿名函数
delayExecFn((name, age) => {console.log(name, age)
})export {}
never

never 表示永远不会发生值的类型。比如一个函数:

  • 如果一个函数中是死循环或者抛出异常,那么这会返回东西吗?
  • 不会,那么写 void 类型或者其他作为返回值都不合适, 我们就可以使用 never类型

可能有些抽象,我们一起来看个应用案例吧,其中用到了联合类型,具体可以看我的另一篇文章

// 一. 实际开发中只有进行类型推导时, 可能会自动推导出来是never类型
// 但是很少使用它
// 1.一个函数是死循环
// function foo(): never {
//   // while(true) {
//   //   console.log("-----")
//   // }
//   throw new Error("1233")
// }
// foo()// 2.返回一个空数组的函数
// bar函数的类型为:never[]
function bar() {return []
}// 二. 封装框架/工具库的时候可以使用一下never
// 其他时候在扩展工具的时候, 对于一些没有处理的case, 可以直接报错
function handleMessage(message: string | number | boolean) {switch (typeof message) {case "string":console.log(message.length)breakcase "number":console.log(message)break
//    case "boolean":
//      console.log(Number(message))
//      breakdefault:const check: never = message}
}handleMessage("aaaa")
handleMessage(1234)// 此时switch分支的default会报错,必须加上'boolean'的判断情况才行
handleMessage(true)export {}

在这里插入图片描述

tuple
// 保存个人信息: kobe 18 1.88
// 1.使用数组类型
// 不合适: 数组中最好存放相同的数据类型, 获取值之后不能明确的知道对应的数据类型
const info1: any[] = ["kobe", 18, 1.88]
const value = info1[2]
console.log()// 2.使用对象类型(最多)
const info2 = {name: "why",age: 18,height: 1.88
}// 3.使用元组类型
// 元组数据结构中可以存放不同的数据类型, 取出来的item也是有明确的类型
const info3: [string, number, number] = ["why", 18, 1.88]
const value2 = info3[2]// 在函数中使用元组类型是最多的(函数的返回值)
function useState(initialState: number): [number, (newValue: number) => void] {let stateValue = initialStatefunction setValue(newValue: number) {stateValue = newValue}return [stateValue, setValue]
}const [count, setCount] = useState(10)
console.log(count)
setCount(100)export {}

可以看出,元组与数组有些类似,那么tuple和数组有什么区别呢?

  • 首先, 数组中通常建议存放相同类型的元素不同类型的元素不推荐放在数组中 。(可以放在对象或者元组中) 。
  • 其次, 元组中每个素都有自己特性的类型 ,根据索引值获取到的值可以确定对应的类型
const info: (string|number)[] = ['coder', 25, 1.88]
const item1 = info[0] // 不能确定具体的类型,只能确定为联合类型const tupleInfo: [string, number, number] = ['coder', 25, 1.88]
const item2 = info[0] // 类型一定是stringexport {}

总结

本篇文章我们讲述了TS的基本数据类型及其简单使用,下篇文章我们一起来唠唠TS语法细节哪些事。

这篇关于手拉手带你掌握TS数据类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/751622

相关文章

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

生信代码入门:从零开始掌握生物信息学编程技能

少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 介绍 生物信息学是一个高度跨学科的领域,结合了生物学、计算机科学和统计学。随着高通量测序技术的发展,海量的生物数据需要通过编程来进行处理和分析。因此,掌握生信编程技能,成为每一个生物信息学研究者的必备能力。 生信代码入门,旨在帮助初学者从零开始学习生物信息学中的编程基础。通过学习常用

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

Redis地理数据类型GEO

通常要计算两个地理位置的距离不是很方便,这里可以直接通过Redis提供的GEO操作来完成地理位置相关的计算 1)添加地理位置 语法:geoadd key longitude latitude member [longitude latitude member] ...字段说明:key:存放地理位置的集合名称longitude:地理坐标的经度latitude:地理坐标的纬度member:表示这

JAVA初级掌握的J2SE知识(二)和Java核心的API

/** 这篇文章送给所有学习java的同学,请大家检验一下自己,不要自满,你们正在学习java的路上,你们要加油,蜕变是个痛苦的过程,忍受过后,才会蜕变! */ Java的核心API是非常庞大的,这给开发者来说带来了很大的方便,经常人有评论,java让程序员变傻。 但是一些内容我认为是必须掌握的,否则不可以熟练运用java,也不会使用就很难办了。 1、java.lang包下的80%以上的类

JAVA初级掌握的J2SE知识(一)

时常看到一些人说掌握了Java,但是让他们用Java做一个实际的项目可能又困难重重,在这里,笔者根据自己的一点理解斗胆提出自己的一些对掌握Java这个说法的标准,当然对于新手,也可以提供一个需要学习哪些内容的参考。另外这个标准仅限于J2SE部分,J2EE部分的内容有时间再另说。 1、语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道

作为刚从事Java开发的小白,需要掌握哪些技能

作为一个刚踏入Java开发世界的小白,面对各种技术和工具,你可能会觉得有点不知所措。但是别担心,我会给你一个简单清晰的路线图,让你可以有条不紊地掌握基本技能,逐步成长为一名Java开发者。 1. 扎实的Java基础 Java的基础是你迈向高级开发的重要基石,建议从以下几个方面着手: 语法和基础概念:比如变量、条件语句、循环、方法、数组、面向对象编程(OOP)等等。这些基础如同建房子的地基,越

掌握Hive函数[2]:从基础到高级应用

目录 高级聚合函数 多进一出 1. 普通聚合 count/sum... 2. collect_list 收集并形成list集合,结果不去重 3. collect_set 收集并形成set集合,结果去重  案例演示 1. 每个月的入职人数以及姓名  炸裂函数  概述  案例演示 1. 数据准备 1)表结构 2)建表语句 3)装载语句 2. 需求 1)需求说明 2)答

【JavaScript】基本数据类型与引用数据类型区别(及为什么String、Boolean、Number基本数据类型会有属性和方法?)

基本数据类型   JavaScript基本数据类型包括:undefined、null、number、boolean、string。基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值。 1)基本数据类型的值是不可变的 任何方法都无法改变一个基本类型的值,比如一个字符串: var name = "change";name.substr();//hangconsole.log