前言
强类型定义语言在速度上可能略逊色于弱类型定义语言,
但是强类型定义语言带来的严谨性能够有效的避免许多错误。
基本类型,声明
声明类型
var [变量名] : [类型]; //初始变量值会设置为 undefined:
如: var uname:string;
多个类型
var [变量名] : [类型]| [类型];
如:
let c:boolean|string;
c=true;
c="ho";
任意类型
let d:any; //任何类型
d=10;
d='hello';
d=true;
var [变量名] = 值;
如:var a; //隐式,相当于 var d:any;
注意:
let a:string;
let b=1;
a=b; //any类型,赋值给其它,不会报错,此时a的类型也是any
unknown类型
let e:unknown;
e=10;
e="hrll";
e=true;
let a:string;
a=e; //unknown类型,赋值给其它,会报错
如果,就想赋值给它
方法1:
if(typeof e === "string"){
a=e;
}
方法2:
类型断言
a=e as string;
可以简写: a=<string>e;
/*
* 不会报错
* 可以告诉解析器,变量的实际类型
*/
let k:1|2|3;//k可以是1,2,3
类型别名
type str=string;
let k:str;//k的类型是字符串
type abc=1|2|3;
let k:abc;//k可以是1,2,3
引用类型,声明
//object表示一个js对象
let a:object;
等同于
let a:{};
let a:{name:string};
a={}//会报错,必须要有name属性,并且类型是字符串
a={name:"悟空"}
a={name:"悟空",age:123}//会报错,必须要有name属性,并且类型是字符串
let a:{name:string,age?:number};
表示age可有可无
//[propName:string]:any 表示后面,可以是任意类型的属性
//[propName:string]:number 表示后面,number类型的属性
let c:{name:string,[propName:string]:any};
c={name:"ss",a:1,b:true}
/*
* enum 枚举
*/
enum Gender{
Male=0,
Female=1
}
let i:{gender:Gender};//gender,只能用Gender
i={
gender:Gender.Male
}
/*
* &表示同时
*/
let j:string&number;//是string,同时是number
这样写没有意义
let j:{name:string}&{age:number};//对象里是,string,同时是number
j={name:"ss",age:18}
let d:(a:number,b:number)=>number;
//希望d是函数,a,b是number,返回类型number
let a:string[];
等同于
let a:Array<string>;
//表示字符串数组,数组里只能是字符串
let a:number[];//数值数组
/*
* 元组,元组就是固定长度的数组
*/
let h:[string,string];//只能定义2个字符串,必须是2个,不能是一个,3个...
函数
function num(a:number,b:number):number{
//a,b只能是number类型,并且返回类型必须是number
}
function fun():number|string{
//并且返回类型必须是number,string
}
function fun():viod{
/*
* viod 用来表示空
* 没有返回值,写return报错
* 可以返回null,undefined
*/
}
function fun2():never{
throw new Error('报错了!')
//never 表示永远不会返回结果,会报错
}
let d:(a:number,b:number)=>number;
//希望d是函数,a,b是number,返回类型number