1、介绍
TS是JS的超集,TS提供了JS的所有功能,并且额外的增加了:类型系统。
- 所有的 JS 代码都是 TS 代码。
- JS 的所有数据类型 TS 都支持,但是 JS 不会检查变量的类型是否发生变化,而 TS 会检查。
文章图片
2、TS常用数据类型
可以将TS中的常用基础类型细分为两类:JS已有类型、TS新增类型。
①JS已有数据类型:number、string、boolean、undefined、function、object、symbol(null属于object类型)。
②TS新增类型:联合类型、自定义类型(类型别名)、接口、元组、字面量类型、枚举、void、any 等。
3、使用
JS已有数据类型使用
/**
* number、string、boolean、undefined、Function
*/
let Name: string = '张三';
let age: number = 18;
let married: boolean = false;
let nothing: undefined;
let getMobile: Function = function(){
return "13511112222";
};
/**
* object类型:null、数组、json对象
*/
let wife: null = null;
//数组有两种写法
let numbers: number[] = [1,2,3];
let strings: Array = ['1','2','3'];
TS新增类型使用
一、联合类型
/**
* 联合类型:一个变量可能存在多种数据类型,使用|符号
* 1、普通变量存在多种类型
* 2、数据中存在多种数据类型
*/
let a: (string|number) = '字符串';
a = 18;
let arrs: (number|string|boolean)[] = [1,'2',true];
let arrs2: Array<(number|string|boolean)> = [1,'2',true];
二、自定义类型(类型别名)
/**
* 类型别名:当同一类型(复杂)被多次使用时,可以通过类型别名,简化该类型的使用,使用type关键字
*/
type myArrType = (number|string|boolean)[];
let arr3: myArrType = [1,'2',true];
三、函数参数和返回值类型
//普通写法
function addFun(num1: number,num2: number): number{
return num1+num2;
}//箭头函数写法
const squareFun = (num: number): number =>{
return num*num;
}//箭头函数另类写法
const squareFun2: (num: number)=>number = (num)=>{
return num*num;
}//当函数无返回值(void关键字)
const subFun = (num1: number,num2: number): void=>{
console.log(num1-num2);
}//当函数参数可选(参数名后面添加?符号)
const printFun = (str1: string,str2?: string): void=>{
console.log(str1);
console.log(str2);
}
printFun('1','2');
printFun('1');
四、json对象类型,TS针对此类型,主要就是描述对象内部有哪些属性,且每个属性属于什么类型
/**
* json对象
* 直接使用{}描述对象结构
* 采用属性名: 类型 格式描述属性列表,多个属性使用 ;
或, 符号分割
* 可选属性在属性名后使用? 符号
*/
//type personType = {name: string,age: number,married: boolean,emile?: string,say: Function};
type personType = {name: string;
age: number;
married: boolean;
emile?: string;
say: Function};
let person: personType = {
name:"张三",
age:18,
married:false,
say:(): void=>{
console.log("hello "+person.name);
}
};
五、接口类型:当一个json对象类型需要复用时,可以将其定义为接口类型(interface)。
/**
* interface
* 直接使用{}描述对象结构
* 采用属性名: 类型 格式描述属性列表,多个属性使用 ;
或, 符号分割
* 可选属性在属性名后使用? 符号
*/
//interface personType {name: string,age: number,married: boolean,emile?: string,say: Function};
interface personType {name: string;
age: number;
married: boolean;
emile?: string;
say: Function};
let person: personType = {
name:"张三",
age:18,
married:false,
say:(): void=>{
console.log("hello "+person.name);
}
};
/**
* interface(接口)和 type(类型别名)的对比:
*相同点:都可以给对象指定类型。
*不同点:
*接口只能为对象指定类型,类型别名可以为任意类型指定别名。
*接口可以进行继承,类型别名不能继承。
*/
interface studentType extends personType {studentNumber:string};
六、元组类型:元组类型是另一种类型的数组,确切地标注数组有多少个元素,且每个元素数据类型。
//应用场景:在地图中,使用经纬度坐标来标记位置信息。
let position: [number,number] = [25.362,78.125];
七、类型推断:在TS某些情况下,没有明确标注变量数据类型,TS也会隐示的为变量添加类型(可充分利用TS类型推断的能力,能省略就尽量省略,提高开发效率)。
①申明变量并初始化值时,可省略变量类型
let num = 10;
//与 let num: number = 10;
效果一致
num = '20';
//编译报错:Type 'string' is not assignable to type 'number'
②决定函数返回值时,可省略函数返回值类型
const add = (num1: number,num2: number)=>{
return num1+num2;
}
/**
* 与此写法效果一致
* const add = (num1: number,num2: number): number=>{
*return num1+num2;
*}
*/let result: string = add(1,2);
//编译报错:Type 'number' is not assignable to type 'string'
八、字面量类型:TS中任意值均可作为类型使用。
/**
* 此处设置变量 Name 的类型为 'jack','jack'类型就是字面量类型
* Name变量的值必须为字面量类型的值,否则编译报错
*/
let Name: 'jack' = 'jack';
let age: 18 = 18;
/**
* 字面量使用场景:往往用来表示一组固定的可选值列表(字面量类型+联合类型)
* 调用此函数传递的参数必须为指定字面量类型中的一个(类似于枚举)
*/
const moveFun = (direction: ('up'|'down'|'left'|'right'))=>{
console.log(direction);
}
九、枚举类型:一组固定的常量值列表。
/**
* 枚举:使用enum关键字定义
*/
enum direction {
UP,
DOWN,
LEFT,
RIGHT
}
/**
* 枚举常量列表默认值为number,从0开始自增
*/
console.log(direction.UP);
//0
console.log(direction.DOWN);
//1
console.log(direction.LEFT);
//2
console.log(direction.RIGHT);
//3/**
* 自定义枚举常量值
*/
enum direction2 {
UP='UP',
DOWN='DOWN',
LEFT='LEFT',
RIGHT='RIGHT'
}
/**
* 枚举作为参数使用
*/
const moveFun2 = (direction: direction2)=>{
console.log(direction);
}
moveFun2(direction2.UP);
【前端|2、TypeScript常见数据类型】十、any类型:声明变量可以为任意类型(弱类型)。
/**
* 将变量obj定义为any类型,所以任意改变obj类型值都不会编译报错
* 应尽量避免使用any类型,any会使TS失去类型保护的优势
*/
let obj: any = 1;
obj = '123';
obj = {"name":"张三"};
推荐阅读
- 前端|1、React介绍
- node.js|计算机毕业设计node.js+vue在线日程管理系统
- 漏洞|CVE-2018-8715(AppWeb认证绕过漏洞)
- TypeScript学习|TypeScript学习笔记十二(条件类型、内置条件类型)
- 11|关于 JavaScript 中 null 的一切
- 面试指导|一天时间迅速准备前端面试|JS基础--变量类型和计算
- 前端|微信公众号支付(JSAPI)
- 微信小程序|uniapp打包微信小程序识别二维码
- 前端|uniapp开发微信小程序的坑