ts中数据类型的定义是重点之一,所以必须明确ts有哪些数据类型
1.布尔类型
最基本的数据类型就是简单的true/false值,在JavaScript和TypeScript里叫做boolean
(其它语言中也一样)。
let isDone: boolean = false;
注意:在js中,除了false和true.,比如:true可以用其他的数据类型的数据去替换而实现统样的效果,所以我们常常并没有特意去计较它是不是真的布尔值.比如
var a=true if(a){ console.log(a) } a=1 if(a){ console.log(a) }
而ts中则不允许非同类型的数据进行赋值,后续的隐患就少了很多
2.数值(数字)类型
和JavaScript一样,TypeScript里的所有数字都是浮点数。 这些浮点数的类型是 number
。 除了支持十进制和十六进制字面量,TypeScript还支持ECMAScript 2015中引入的二进制和八进制字面量。
let decLiteral: number = 6; let hexLiteral: number = 0xf00d; let binaryLiteral: number = 0b1010; let octalLiteral: number = 0o744;
对比与js,绝大部分的数据类型转换的方式,只要等号右边的返回值是数值都可以,但并不是所有,至少有一个(true-1)不能用于给ts中的number类型变量赋值
3.字符串
let a:string='6' let b:boolean=true a=7+'' a=b.toString()
基本的转化也能拿来赋值.同时也允许模板字符串赋值
4.null和undefined
TypeScript里,undefined
和null
两者各自有自己的类型分别叫做undefined
和null
let a:null=null let b:undefined=undefined
但是,默认情况下null
和undefined
是所有类型的子类型.也就是说你可以把它们赋值给任何类型的数据.包括后面要讲的几种数据类型.
![](https://img2020.cnblogs.com/blog/1694496/202007/1694496-20200731161347703-100384322.png)
不是说数据类型要分清除吗?怎么到这里就不分了.这里主要是设计到几个场景,比如我定义了,但是没赋值.那我得给他一个默认值吧?无论他是什么类型的,我都给了undefined,null也是类似的初始化作用.
当然,如果你就是想明确一点,毕竟有时候null和undefined也会对项目造成不可预估的影响,也是有手段的.在编译生成js代码的时候输入下面的代码
tsc [filename] --strictNullChecks
5.数组
TypeScript像JavaScript一样可以操作数组元素。 有两种方式可以定义数组。 第一种,可以在元素类型后面接上 []
,表示由此类型元素组成的一个数组
let list: number[] = [1, 2, 3];
第二种方式是使用数组泛型,Array<元素类型>
:
let list: Array<number> = [1, 2, 3];
可以明显的看出,无论哪种方式,都定义了元素的数据类型.所以,只要是符合定义的元素,无论string,number,boolean,只要是单一的类型,都是可以在数组里的.但是只要存在不符合的就报错
6.元组.
如果说数组是单一类型的元素组成的数组,那元祖就包括除此之外的数组
let a:[string,number];
a=['1',1]
申明与赋值规则如下
(1)定义时,每个位置上的元素数据类型都必须声明.同时赋值时要一一对应
(2)申明时的数据类型申明不会改变,所以在浅拷贝时也会先验证拷贝对象是否符合当前申明,不符合不给拷贝.
注意:官网有说可以越界查询.所有后续需要再确认一下
但我在实际试验的时候,并不能越界.具体原因后续再调查
7.枚举
enum
类型可以用js的思路理解为一个对象,对象里的每个属性值都是这个类型的值,比如
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
但是,它自己本身不能作为值被赋予
数值:具体的数值部分要讨论的情况比较麻烦,单独开一篇.这里就讲默认情况
(1)默认状态,默认从0开始,后续属性+1
![](https://img2020.cnblogs.com/blog/1694496/202008/1694496-20200803095417596-848514238.png)
8.Any(可变的,可以是任何数据类型)
有时候,有些数据类型确实是不确定的,特别是第三方的数据.有时候是数值,有时候是字符串.这时候给它一个Any类型,就可以解除编译校验,让代码顺利运行.
![](https://img2020.cnblogs.com/blog/1694496/202008/1694496-20200803100755672-1709936753.png)
9.void
(不能是任何类型)
一般没有返回值的函数它的返回值是void类型,不过注意,undefined和null可以作为值赋予它
![](https://img2020.cnblogs.com/blog/1694496/202008/1694496-20200803101117971-691745098.png)
10.Never(从不,没有完结的,无法到达的)
void类型是没有返回值的函数返回的,但有一个问题,假如这个函数执行不完呢?不就不知道有没有返回值了,此时void就不合适了.这个函数的返回值就是never类型的.
// 返回never的函数必须存在无法达到的终点 function error(message: string): never { throw new Error(message); } // 推断的返回值类型为never function fail() { return error("Something failed"); } // 返回never的函数必须存在无法达到的终点 function infiniteLoop(): never { while (true) { } }
11.Object
object
表示非原始类型,也就是除number
,string
,boolean
,symbol
,null
或undefined
之外的类型。
使用object
类型,就可以更好的表示像Object.create
这样的API.
declare function create(o: object | null): void; create({ prop: 0 }); // OK create(null); // OK create(42); // Error create("string"); // Error create(false); // Error create(undefined); // Error
12.类型断言
这个准确来说不是一种数据类型,而是类似数据转换.也就是说,你前面给某个数据定好类型了,但是后面明确了它是另一种类型,这时候就可以使用类型断言告诉ts,你不用在这里限制我了,我知道自己在做啥,我先转换,然后你再监听.在举例子之前我们先要明白一点,'访问联合类型值的属性时,这个属性必须是所有可能类型的共有属性'.什么意思呢?比如:
当创建函数的时候,val定义的数据类型是既有可能是string,又有可能是number,而number.length是错误的,不存在的.所以ts就会提醒你"程序员,你这里写的是不是有问题?"
那么这时候用类型断言,就是告诉ts,这里使用.length的时候是string类型的,我知道.换句话说,你也可以理解成一种类型选择,if(val的类型是string)就.length.
以上差不多就是ts的数据类型了.因为ts算是'强数据类型'.所有为了涵盖所有js中的数据类型,明显的多出来好几种数据类型.不过大类还是基础数据类型和非基础数据类型.而非基础数据类型又是建立在基础数据类型之上的,所有非基础数据类型的数据分类还是建立在基础数据类型上的.