ts数据类型
ts数据基本数据类型
声明了类型之后,变量的类型不能改变
一根竖线| :表示或者,用来连接多个类型(联合类型)
问号?代表可选
&表示且
布尔值类型boolean
let bool:boolean=true
数字类型number
let num:number=10
字符串类型string
let str:string="年少不知富婆好,错把美貌当成宝"
undefined类型
const und:undefined=undefined
null类型
const nul:null=null
null和undefined是其他类型的子类型,可以赋值给任意类型
数组类型Array
let arr:number[]=[1,2,3]
let arr:Array<number>=[10,20,30]
let arr:Array<nunber|string>=["hello",100,200]
数组定义后,里面的数据类型和定义数组的时候必须是一致的,否则会报错
元组类型tuple
let yuanZu:[string,number,boolean,undefined]=['haha',10,true,undefined]
元组是ts新增的数据类型,可以理解为固定长度,每个位置数据类型固定的数组
枚举类型enum
enum Color {
red,
blue,
yellow,
}
let color = Color.red;
console.log(color); //0
console.log(Color[2]); // yellow
enum Sex {
男 = 1,
女,
}
console.log(Sex.男); //1
console.log(Sex[2]); //女
枚举中的每个元素都有一个编号,默认从0开始,后面递增1;但是我们也可以自己定义,eg从1开始
枚举可以通过元素获取编号,也可以通过编号获取对应元素
元素可以直接是中文,但是我们不建议这么写
any类型
let anyType: any = 100;
anyType = "窗前明月光,起来区开窗;被赏一耳光,牙齿全掉光";
console.log(anyType);
let a: any[] = [false, 666, "hello"];
可以是任意类型,好用,但是编译的时候没有报错提示;相当于直接使用js语法
unknown类型
和any相似,都可以给任何类型的值赋值给变量;
但是如果将这个变量复制给一个已知类型的变量,unknow会报错,而any不会
let unknowType: unknown;
unknowType = 10;
unknowType = "str";
console.log(unknowType);
let c = unknowType;
let d = 12;
d = unknowType; // 这一行会报错,因为d已经推断出来是数字,不能将unknown赋值给数字类型的,而如果是 any的话就不会报错,undefined,null,any都可以赋值给任意类型
void类型
function doSomething(): void {
const str: string = "只要富婆把握住,连夜搬进大别墅";
}
doSomething();
// 给void赋值,意义不大
// let vo: void = null/undefined;
在函数声明的时候,小括号后面使用void,代表该函数没有返回值 (也等价于函数返回undefined或null)
对象类型object
interface Person {
age;
name;
height;
}
function getFitResult(obj: Person): object | boolean {
const singleMale = {
name: "Luca",
age: 24,
height: 180,
};
if (singleMale.age - obj.age <= 5 && singleMale.height - obj.height < 15) {
return singleMale;
} else {
return false;
}
}
const re = getFitResult({ name: "Ari", age: 24, height: 168 });
console.log(re);
let a:{name:“孙悟空”}
let a={name:“孙悟空”,age?:number}
let a={name:“luca”,[propName:string]:any} ,必须有name,还可以有其他任意类型属性
联合类型union
let a:number|string=20
a="hello"
表示可以是多种类型中的一种
表格形式
类型 | 实例 | 描述 |
---|---|---|
number | 0,12,-20 | 任意数字 |
string | “hello” | 任意字符串 |
boolean | true/false | 布尔值true/false |
字面量 | 其本身 | 限制变量的值就是改字面量的值;有点类似与const,声明了就不能改 |
any | * | 任意类型,设置为any,相当于对该变量关闭了TS,与js差不多 |
unknown | * | 类型安全的any |
void | 空值(undefined) | 没有值(或undefined);多用于函数没有返回值 |
never | 没有值 | 不能是任何值,可用于函数报错 |
object | {name:“luca”} | 任意对象;{}用来指定对象中包含哪些属性,属性后加上问好,表示可选 |
array | [1,“fun”,true] | 任意数组 |
tuple | [4,5] | 元组,TS新增类型,固定长度的数组 |
enum | enum{A,B} | 枚举,TS新增类型 |
undefined | undefined | 任意类型的子类型 |
null | null | 任意类型的子类型 |
其他相关概念
类型断言
告诉编译器,我知道是什么类型,知道自己在干什么
语法:
变量 as 类型
<类型>变量
function getLength(str: string | number) {
由于接收的参数可能是数组,数字没有length,直接用会报错,所以使用类型断言来解决
if ((<string>str).length) {
// 如果存在长度,那么是字符串
return (str as string).length;
} else {
return str.toString().length;
}
}
类型推断
如果没有指定变量类型,他会根据赋值情况,推断出一个类型
如果声明的同时赋值,那么TS可以自动对变量类型进行检测;所以声明并赋值,可以省略类型的声明
只声明,不复制,解析器会把他设置为any(隐式any)
let a=100 推断为number
let b //推断为any