一, ts开发环境搭建
(1)安装Node.js
(2)使用npm全局安装typescript
-进入命令行
-输入 :
npm i -g typescript
(3)创建一个ts文件
(4)使用tsc对ts文件进行编译
-进入命令行
-找到ts文件所在目录
-执行命令:tsc xxx.ts
二,ts类型声明
- 通过类型声明可以指定ts中变量(参数, 形参)的类型
- 指定类型后,当为变量赋值时,ts编译器会自动检查值是否符合类型声明,符合则赋值,否则报错
- 简而言之, 类型声明给变量设置了类型,使得变量只能存储某种类型的值
语法:
let 变量: 类型
let 变量: 类型 = 值
function(参数: 类型, 参数: 类型): 类型{
.......
}
自动类型判断
- ts拥有自动的类型判断机制
- 当对变量的声明和赋值是同时进行的,ts编译器会自动判断变量的类型
- 所以如果你的变量的声明和赋值是同时进行的,可以省略掉类型声明
let a:number;
a = 10;
// a = 'hello';//此行代码会报错, 因为a的类型是number类型,不能赋值字符串
let b:string;
b = 'hello';
// b = 112;
// 声明完变量直接赋值
let c:boolean = false;
// 如果变量的声明和赋值是同时进行的,ts可以自动对变量进行类型检测
let d = true;
d = false;
// js中函数是不考虑参数的类型和数量的
// function sum(a, b){
// return a + b;
// }
// sum(123, 456);//579
// sum(123, '456');//'123456'
function sum(a:number, b:number):number{
return a + b;
}
let resule = sum(123, 456);
三,ts类型
类型 | 例子 | 描述 |
number | 1, -33, 2.5 | 任意数字 |
string | ‘111’, 'hi', hi | 任意字符串 |
boolean | true, false | 布尔值true或者false |
字面量 | 其本身 | 限制变量的值就是该字面量的值 |
any | * | 任意类型 |
unknown | * | 类型安全的any |
void | 空值(undefined) | 没有值(或undefined) |
never | 没有值 | 不能是任何值 |
object | {name:'孙悟空'} | 任意的js对象 |
array | [1, 2, 3] | 任意js数组 |
tuple(元组) | [4, 5] | ts新增类型,固定长度数组 |
enum(枚举) | enum(A,B) | 枚举,ts新增类型 |
下面是针对不同的类型进行学习的具体内容:
// 直接使用字面量进行类型声明
let a: 10;
a = 10;
// 可以使用 | 连接多个类型(联合类型)
let b: 'male' | false;
b = 'male';
b = false;
let c: string | boolean;
c = 'helllo';
c = true;
// any表示的是任意类型,一个变量设置类型any相当于对该变量关闭了ts的类型检查
// 使用ts时,不建议使用any类型
// let d: any;//显式的any
// 声明变量如果不指定类型, 则ts解释器会自动判断变量的类型为any(隐式的any)
let d;
d = 10;
d = true;
d = 'hello';
//unknown 表示未知类型的值
let e: unknown;
e = 10;
e = true;
e = 'hello';
let s: string;
// d的类型是any,他可以赋值给任意变量
s = d;
// unknown 实际就是一个类型安全的any
// unknown 类型的变量不能直接赋值给其他类型的变量
// s = e;//报错
if(typeof e === 'string'){
s = e;
}
// 类型断言, 可以用来告诉解析器变量的实际类型
s = e as string;
// 或
s = <string>e;
// void用来表示空, 以函数为例,就表示没有返回值的函数
function fn1():void{}
// never 表示永远不会返回结果
function fn2(): never{
throw new Error("never");
}
//object 表示一个js对象
let a: object
a = {};
a = function () {}
//{} 用来指定对象中可以包含哪些属性
//属性名后加?表示属性是可选属性
let b = {name:string, age?:number}
b = {name:'1111'};
//[propName:string]:any 表示任意类型的属性
let c: {name:string, [propName:string]:any}
c = {name:'111', age:10, gender:"男"}
/*
设置函数结构的类型声明
语法:(形参:类型, 形参:类型) => 返回值
*/
let d: (a:string, b:string)=>number
d = function(n1, n2):number{
return n1 + n2
}
//string[]或者<Array>string 表示字符串数组
let e: string[];
e = ['1', '2']
let g: <Array>string
g = ['1', '2', '3']
//元组: 固定长度的数组
let h:[number, string]
h = [1, 'h'];
//enum: 枚举
enum Gender= {
Male = 1,
Female = 2
}
let i:{name:string, gender:Gender}
i = {
name: "111",
gender: Gender.Male
}
//&表示同时
let j: {name: string} & {age:number};
j = {name:'1111', age:10}
//类型别名
//let k: 1 | 2 | 3 | 4
//let l: 1 | 2 | 3 | 4
type myType = 1 | 2 | 3 | 4
let k: myType
let l: myType
let m: myType