TypeScript的变量类型及声明
TS和JS最大的区别就是在其中给变量引入了类型的概念
比如像之前我们使用JS的时候:
var a = 10;
这时a是数据类型,但当如果我们后面要使用a;我们也可以a = "hello";
这时a就变成了一个字符串类型。也就是说我们在js中没有严格的类型的规范,我们可以随意使用它。
但是TS则不同,通过TS我们就可以给变量声明类型。
一、变量类型
1、变量类型
在TS中我们可以指定变量的类型。如:
let a:number;
通过以上声明有什么用处呢?那就是a在以后的使用过程中,a的值只能是数字不能像js一样这次可以赋值为数字,下次可以赋值为字符串。
如果变量的声明和赋值同时进行,TS可以自动对变量进行类型转换,那我们就不用写变量类型,像这样:
let a = 12;///此时TS默认认为变量的类型是数字的形式
let c = fasle;那么以后我们对c只能赋值为boolean类型,因为他会自动推断c的类型
既然说直接赋值可以自动判断类型,那么是不是类型声明就是没有什么用了呢?
2、类型声明的应用
1)给函数声明时的参数使用
当然不是,JS中的函数是不考虑参数的类型和数量,写函数的时候不用考虑类型和数量,但是可能会造成安全的隐患,比如像两个数相加的函数,不小心传过去了一个字符串,那就变成了字符串拼接。
那么类型声明就有用了,我们可以在函数声明的时候,给参数加上类型声明,不会发生上述的情况。可以保证传入的类型不会错,不会出现难找的错误。避免在开发中可能会发生的错误。(语法上相当于js更加的规范)
2)函数的返回值也会用到类型声明
function sum( a: number, b: number):number {返回值为number
return a+b;返回值的类型必须是number类型
}
总结:
类型声明可以在声明时使用
如果数据的声明和赋值同时进行。可以省略类型声明
可以在函数参数和返回值上使用类型声明
二、变量声明
下面让我们来具体的看一下都有哪些函数声明吧!
1、类型都包括:number、string、boolean(基本的)、或者可以直接使用字面量来声明类型。
如:
1)let a:10; a =11;///就会报错,类似const,赋值后不能改
2)let b:"male"|"female";/使用|来连接多个类型,b的值只能有这两种
3)let c:boolean|string;/c的值可以是两种类型
这种类型叫联合类型
2、any和unknown类型
1)let d:any;/any表示的是任意类型,可以任意赋值
需要注意的是: (let d;隐式声明,也是any类型)
一个变量设置为any后,相当于对该变量关闭了TS的类型检测,就变得和js一样了
即如果声明时不指定变量的类型,则默认解释为any类型
2)let e:unknown;表示未知类型的值
any和unknown的区别是什么呢?
1)当我们声明一个string类型的变量,如果我们把any类型的值赋给string的变量但是他不会报错。
2)但是当我们是unknown的类型,把unknown类型的值赋值给别的类型就会报错。
总结:unknown实际上是一个类型安全的any,不能直接赋值给其他变量
但是如果想把unknown类型的值赋值给其他类型怎么办呢?
方法一:
if(typeof e === "string"){
s = e;///s为unknown类型 e为string类型
}
方法二:类型断言(告诉编译器e(变量的实际的类型)的类型)
s = e as string;(第一种写法)
s = <string>e;(第二种写法)
3、void(空值)、never(没有值)设置函数的返回值
function fn():number{/指定返回值类型
return 1;
}
1)当函数没有返回值,就用void来表示,void用来表示空,以函数为例,表示当前函数没有返回值。
2)never:类似void但是never表示永远不会返回结果(没有值)
用途:用来报错的
function fn():never{
throw new Error("报错了!");
}
4、其他类型:
1)object表示一个js对象
let a:object;
a = {};
a = function(){
}
let b :{ name:string,age?:number};///问号表示一个可选属性,可以有也可以没有;{}里面写包含哪些属性
如果想让对象有多个可有可无的属性怎么办?
let c : { name:string,[propName(自定义名字) : string]:any }///表示任意类型的属性
c = {name:'啊啊啊',age:18,gender:'男'};
2)array数组(两种声明方法:类型[]、Array<类型>)
let e : string[];表示字符串数组(数组里寸的都是字符串)
let f :number[];///表示数值类型的数组
let g : Array<number>;表示数值类型的数组
3)tuple元组:就是固定长度的数组
元组和数组的区别:元组的效率会好一些,元组长度固定的
let h : [string,string];这个元组有两个值,类型都是string
4)enum枚举:
enum Gender{
Male = 0,
Female = 1
}
let i : { name:string , gender:Gender};
i = {
name : 'su',
gender: Gender.Male//male 因为要给别人用所以要考虑
}
//&表示同时,一个类型即是string又是number
let j : string & number;///没有意义
let j : {name:string} & {age:number};///对象中同时有两个类型
类型的别名:
type myType = 1|2|3|4|5;
let k:1|2|3|4|5;k值的范围(直接写let k : myType;)
let l:1|2|3|4|5;
这样写很麻烦因为是同样的内容我们要写很多遍,所以我们可以使用别名
type myType = string;给string起别名