【TS】常用类型概述

一、JS 数据类型

TS中常用的基本类型可以细分为两类:1. js已有类型,2.ts新增类型。

  • JS 已有类型(原始类型):
原始类型例子描述
number1,-22,1.3任意数字
string“af”,“JF”任意字符串
booleantrue, false布尔值
nullnull空值
undefinedundefined未定义
symbolsymbolsymbol
let a: number = 18;
let b: string = '字符串';
let c: boolean = true;
let d: null = null;
let e: undefined = undefined;
let f: symbol = Symbol();
  • JS 已有类型(对象类型):
对象类型例子描述
object{age: 45}任意的js对象
array[1,2,3]任意的js数组
function(a,b)=>a+b函数类型

1.1、数组类型

// 写法 1 :类型[]
let arr1: number[] = [1, 2, 3];	// number[] 表示数值数组
// 写法 2:Array<类型>
let arr2: Array<string> = ['a', 'b', 'c'];	// Array<string> 表示字符串数组
// 多个类型写法:
let arr3: (number | string)[] = [1, 'a', 2, 'b']; 	// | (竖线)在TS中叫做联合类型,表示或的意思

1.2、对象类型

  • 用于描述对象的结构
/*
	1. 直接使用 {} 来描述对象结构
		属性采用 属性名:类型 的形式;
		方法采用 方法名(参数:类型): 返回值类型 的形式。
	2. 在一行代码中指定对象的多个属性类型时,使用 ; (分号)分隔
	3. 如果一行代码只指定一个属性类型,可以去掉 ; (分号),比如:let name:{name: string} = {name: 'jack'}
	4. 方法的类型也可以使用箭头函数形式,比如:sayHi:(name:string): void;
*/ 
let person: {
	name: string;
	age: number;
	sayHi(name:string): void;
} = {
	name: 'jack',
	age: 19,
	sayHi(name){
		console.log(name);
	},
}
/*
	对象的属性或方法,也可以是可选的,此时就用到可选属性了。
	可选属性的语法与函数可选参数的语法一致,都使用 ? (问号)来表示。
	比如要实现一个,name是必须存在的,age可有可无。
*/
let obj: {
	name: string;
	age?: number;
};
// 只存在name
obj = {
	name: 'jack',
}
// name 和 age 都存在
obj = {
	name: 'jack',
	age: 19,
}

1.3、函数类型

由于篇幅过大,详细讲解可以参考博主另一篇文章:
https://blog.youkuaiyun.com/qq_45677671/article/details/125394849

  • 函数类型就是函数参数和返回值的类型
// (形参1: 类型, 形参2: 类型) => 返回值
let i: (a: number,b: number)=>number;

// (无参) => 无返回值
let u: ()=>void;

二、TS 新增类型

  • TS 新增类型:
类型描述
字面量限制变量的值就是该字面量的值
any任意类型
unknown类型安全的any
void没有值
never不能是任何值
tuple元组,固定长度数组
enum枚举
type类型别名
interface接口

2.1、联合类型(|

  • 由两个或多个其他类型组成的类型,表示可以是这些类型中的然后一种。
// 可以使用 | 来连接多个类型(联合类型)
let b: "male" | "female";
b = "male";
b = "female";

let c: boolean | string;
c = true;
c = "hello";

2.2、交叉类型(&

  • 类似于接口继承(extends),用于组合多个类型为应该类型(常用于对象类型)
interface Person {name: string};
interface Contact {phone: string};
type PersonDetail = Person & Contact
let obj: PersonDetail = {
	name: 'jack',
	phone: '15698324'
}
// 使用交叉类型后,新的类型PersonDetail就同时具备了Person和Contact的所有属性类型。
// 相当于:
type PersonDetail = {name: string; phone: string;}

2.3、索引签名类型([key: type]: type

  • 使得对象中可以出现任意多个属性
// [propName: string]: any 表示任意类型的属性
let h: {name: string, [propName: string]: any};
h  = {name: "张三", age: 13, gender: "男"};


/*
	1.  使用[key: string]来约束该接口中允许出现的属性名称。
	2. 表示只要是string类型的属性名称,都可以出现在对象中。
	3. 这样,对象 obj 中就可以出现任意多个属性
	4. key 只是一个占位符,可以换成任意合法的变量名称。
	5. 须知:js中对象的键是 string 类型的。
*/
interface AnyObject {
	[key: string]: number;
}
let obj: AnyObject = {
	a: 1,
	b: 2,
}

2.4、任意类型(any)

  • any 表示任意类型,一个变量设置类型为 any 后相当于对该变量关闭了TS的类型检查(使用TS时,不建议使用 any 类型)
  • 声明变量如果不指定类型,则TS解析器会自动判断变量的类型为 any
let d;			// 隐式的any
let d: any;		// 显式的any
d = 10;
d = "hello";
d = true;
let dd: string;
dd = d; // d的类型是any,它可以赋值给任意变量,并改变dd的类型

2.5、未知的值(unknown)

  • unknown 表示未知的值, 实际上就是一个类型安全的any
// unknown 类型的变量,不能直接赋值给其他变量
let e: unknown;
e = 10;
e = "hello";
e = true;
let ee: string;
ee = e; // d的类型是unknown,赋值给ee会报错
// 如果需要赋值并不报错,可以先进行类型判断
if(typeof ee === "string"){
	ee = e; // 不会报错
}

2.6、空值(void)

  • void 表示没有任何类型
  • 当一个函数返回空值时,它的返回值为 void 类型。
// 以函数为例,就表示没有返回值的函数
function fn(): void{
	console.log('仅打印');
}

2.7、无值(never)

  • never 表示永远不存在的值的类型
  • 但是,当一个函数永不返回时(或者总是抛出错误),它的返回值为 never 类型。
function fun(): never{}

let foo: never = 123; // Error: number 类型不能赋值给 never 类型

// ok, 作为函数返回类型的 never
let bar: never = (() => {
  throw new Error('Throw my hands in the air like I just dont care');
})();

2.8、元组(tuple)

  • 元组:固定长度的数组
// 语法:[类型,类型,类型]
let l: [string, number];
l = ["hello", 123]

2.9、类型别名(type)

由于篇幅过大,详细讲解可以参考博主TS专栏该专篇文章:
https://blog.youkuaiyun.com/qq_45677671/category_11127697.html

// 类型的别名
type myType = 1 | 2 | 3;
let o1: myType;
let o2: myType;
let o3: myType;

2.10、枚举(enum)

由于篇幅过大,详细讲解可以参考博主TS专栏该专篇文章:
https://blog.youkuaiyun.com/qq_45677671/category_11127697.html

// enum 枚举
enum Gender{
	Male = 0,
	Female = 1
}
let m: {name: string, gender: Gender};
m = {
	name: "王五",
	gender: Gender.Male	// 0
}
console.log(m.gender === Gender.Male);

2.11、接口(interface )

由于篇幅过大,详细讲解可以参考博主TS专栏该专篇文章:
https://blog.youkuaiyun.com/qq_45677671/category_11127697.html

// 接口: 主要为了实现对象的复用。
// {} 用来指定对象中可以包含哪些属性
// 语法:{属性名:属性值,属性名:属性值}
// 在属性名后面加上?,表示属性是可选的
interface  PeosonType = {name: string, age?: number}
let g: PeosonType;
g = {name: "张三", age: 13};
g = {name: "张三"};		// 没有?号就会报错

2.12、泛型

由于篇幅过大,详细讲解可以参考博主TS专栏该专篇文章:
https://blog.youkuaiyun.com/qq_45677671/category_11127697.html

2.13、字面量类型

字面量是 JavaScript 本身提供的一个准确变量。

  • 你可以使用一个字符串字面量作为一个类型:
let foo: 'Hello';
foo = 'Bar'; // Error: 'bar' 不能赋值给类型 'Hello'

// 通常在联合类型中使用
type CardinalDirection = 'North' | 'East' | 'South' | 'West';

function move(distance: number, direction: CardinalDirection) {
  // ...
}

move(1, 'North'); // ok
move(1, 'Nurth'); // Error
  • 其他字面量类型:
type OneToFive = 1 | 2 | 3 | 4 | 5;
type Bools = true | false;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗不甘坠落的流星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值