一:typescript环境搭建
1:下载node.js
2:使用npm全局安装typescript npm i -g typescript
3:创建应该TS文件 执行 node index.ts
4:使用tsc对文件进行编译 在终端中执行 tsc index.ts 就会将index.ts 转换成 index.js
二:简单的typescript语法
1申明变量
1:申明变量赋值
// 申明一个变量a,指定类型为nuber
// let 变量名:类型;
let a:number;
// 赋值成功
a=0;
// 赋值失败
a='hello';
// 申明变量直接赋值
let b : boolean=false;
// fu(参数1:类型,参数2:类型):fn返回值类型{}
function sum( a:number , b:number) : number {
return a+b;
}
2:ts自动类型判断
ts拥有自动判断类型机制 当对变量的声明和赋值同时进行时ts编译器就可自动判断变量类型 所以声明和变量同时进行时就可省略类型的声明
let a:Number=2;
let b=2;
3:类型
| 标题 | 标题 | 标题 |
|---|---|---|
| number | 1,-1,3.5 | 任意数字 |
| string | 'hi',"hi",hi | s |
| boolean | true,false | 布尔值 |
| object | {name:'tsy'} | js对象 |
| array | [1,2,3] | js数组 |
| tuple | [1,2] | ts新增类型,固定长度的数组 |
| any | * | 任意值 |
| unknown | * | 类型安全的any |
| void | 空值(undefined) | 没有值或者undefined |
| never | 没有值 | 不能是任何值 |
| enum | enum{a,b} | 枚举,ts新增类型 |
| 字面量 | 其本身 | 限制变量的值就是字面量的值 |
.numder
除了整数和浮点数外还可以是进制表示
let a : number = 10;
let b : number = 0xf00d;
.string
let color: string = "blue";
color = 'red';
let fullName: string = `Bob Bobbington`;
let age: number = 37;
let sentence: string = `Hello, my name is ${fullName}.
I'll be ${age + 1} years old next month.`;
.boolean
let isA:boolean=true;
.字面量
可以使用字面量指定变量的类型,和字面量的取值范围
// num的值只能在1或2或3取值
let num:1|2|3;
// color的值只能在red或pink或black
let color:'red'|'pink'|'black';
// a的类型可以是number或string
let a:number|string;
.any
任意值(不安全,少用),相当于typescript关闭了检测类型
let a:any;
a=1;
a='1';
a=true
.unknown 任意值 (安全)
let a:any;
a=1;
a='1';
a=true
any和unknown的区别 两个虽然都是可以赋任意值,主要any可以赋值给其他类型的变量。而unknown不能赋值给已经确定类型的变量
let a:unknown;
let b:any;
a=1;
b=1;
let c:number;
// 报错
c=a;
// 赋值成功
c=b;
如何解决把unknown的值赋值给其他确定类型的变量呢?
let a:unknown;
a=1;
let c:number;
// 报错
c=a;
// 方法一
if(typeof a==='number' ){
// 赋值成功
c=a;
}
// 方法二
// 类型断言
// 赋值成功
c= a as number;
// 方法三
c= <number>a
.void 返回空值或者undefined,多用于函数返回值
function data():void{
}
.never 没有值返回,(和void的区别,viod返回空值或者nudefined,从某种角度上讲空值或者nudefined也算是值,要是真正的没有返回值则是never) 应用场景:多用于报错提醒
function data(): never{
throw new Error('报错了')
}
.object
//可以用object或者{}来指定对象类型
let a:object;
let b:{};
//给对象里的属性指定类型
let c:{name:string,age:number};
c={ name:'tsy',age:23}
// 给对象里的多个属性指定类型
// {属性名:类型,[属性名变量:类型]:类型} []代表多个
let d:{name:string,[propName:string]:any}
d={name:'tys',age:22,sex:'男'}
定义特殊对象 fun结构 我想定义一个传两个参数,一个为string,一个为numder,返回值为numder
语法:(形参:类型,形参:类型...)=> 返回值类型
let a:( x:string , y:number ) => number;
a=function(n1:string,n2:number):number{
return 0;
}
.array
js里数组没有类型的概念。所以什么都能存,数组处理起来会有点麻烦,存储性能比较低。
通常一般在开发在一个数组都存一个类型的值
此声明数组就是声明什么类型的数组
/ 类型[]
// Array<类型>
let x:string[];
x=['t','s','y']
let y:number[];
y=[1,2,3]
let z:Array<number>
z=[4,5,6]
接下来是ts新增类型
.tuple
元组,即长度固定的数组
// 元组:[类型,类型,类型...]
let x:[string,string,number]
// 结构和数量必须和上面一一对应
x=['s','x',2]
.enum 枚举 什么是枚举,把所有可能的情况列出来, 应用场景:结果需要在多个值之间选择的时候就用枚举。
例如,现在有好几个对象
// 0为女,1为男
let a:{name:string,sex:0|1}
a={
name:'tsy',
sex:1
}
// 判断a是男是女
if(a.sex===1){
console.log('男');
}
如果出现sex不止0和1,还有其他的,是不是就会写 sex:0|1|2|3 可以换一种写法来体现结果需要在多个值之间选择这一特性
/enum 枚举
// 0为女,1为男
enum sexs{
x=0,
y=1
}
let a:{name:string,sex:sexs}
a={
name:'tsy',
sex:sexs.y
}
// 判断a是男是女
if(a.sex===sexs.y){
console.log('男');
}
|和&拓展
// 表示x类型为string或number
let x:string|number
有|就有&
// 表示x类型为string且为number
let x:string&number
//这个写法虽然没有报错,但这样写是毫无意义的
那么&要怎么用才有意义
//表示x对象,必须包含name和age且类型为string,number
let x:{name:string}&{age:number}
x={name:'tsy',age:23}
类型别名 应用场景:减少代码重复,提升复用性
// 代码重复
let x:1|2|3|4;
let y:1|2|3|4;
// 代码复用
type myType = 1|2|3|4;
let z:myType;
let i:myType