TS学习之路(一)

TS是一个可选的静态的类型系统
需要在变量函数的参数函数的返回值后面加上: 类型

基本类型

  • number:数字
	let num: number = 123;
  • string:字符串
	let str: string = "abc";
  • boolean:布尔值
	let isTrue: boolean = true;
  • 数组
	let arr1: number[] = [123, 234];
	// 或
	let arr2: Array<number> = [1, 2, 3];
  • object:对象
	function printValues(obj: object) {
		const vals = Object.values(obj);
		vals.forEach(v => console.log(v))
	}
  • null 和 undefined:空
    null 和 undefined 是所有其他类型的子类型,它可以赋值给其他类型
    在配置中添加strictNullChecks: true可以获得更严格的空类型检查,此后null和undefined只能赋值给自身

其他常用类型

  • 联合类型:多种类型任选其一,配合类型保护进行判断
	let name: string | undefined = undefined;
  • void类型:通常用于约束函数的返回值,表示该函数没有任何返回值
	function printMenu() {
		console.log("1. 登陆");
		console.log("2. 注册");
	}
  • never类型:通常用于约束函数的返回值,表示该函数永远不可能结束
	function throwError(msg: string): never {
		throw new Error(msg);
	}
  • 字面量类型:使用一个值进行约束
	let a: "A";
  • 元祖类型(Tuple):一个固定长度的数组,并且数组中每一项的类型确定
	let tuple: [string, number];
  • any类型:可以绕过类型检查,any类型的数据可以赋值给任意类型
	let data: any = "abcde";
	let num: number = data;

类型别名

对已知的一些类型定义名称,type 类型名 = ...

type Gender = "男" | "女"
type User = {
	name: string
	age: number
	gender: Gender
}
let u: User = {
	name: "张三",
	age: "18",
	gender: "男"
}
function getUsers(g: Gender): User[] {
	return []
}

函数的相关约束

函数重载:在函数实现之前,对函数调用的多种情况进行声明

function combine(a: number, b: number): number;
function combine(a: string, b: string): string;
function combine(a: string | number, b: string | number): string | number {
	if (typeof a === "string" && typeof b === "string") {
		return a + b
	} else if (typeof a === "number" && typeof b === "number") {
		return a * b
	} else {
		throw new Error("a和b类型必须相同")
	}
}

可选参数:可以在某些参数名后加上?,表示该参数可以不用传递,可选参数必须在参数列表的末尾

function sum(a: number, b: number, c?: number) {

}
sum(3, 4)
sum(3, 4, 5)

枚举

用于解决类型别名 逻辑含义与真实含义相混淆的问题
定义枚举:

	enum 枚举名 {
		枚举字段1 =1,
		枚举字段2 =2,
		...
	}
	enum Gender {
		male = '男',
		female = '女',
	}

枚举的规则:

  • 枚举的字段可以是数字,也可以是字符串
  • 数字枚举的值会自动自增
  • 被数字枚举约束的变量,可以直接赋值为数字(可能会导致一些问题,尽量避免)
  • 数字枚举的编译结果 和 字符串枚举有差异
  • 尽量不要在一个枚举中即出现字符串字段,又出现数字字段
  • 使用枚举时,尽量使用枚举字段的名称,而不使用真实的值

接口

用于约束类、对象、函数的标准
接口与类型别名一样,不出现在编译结果中

// 约束对象
interface User {
	name: string
	age: number
}
// 约束函数 - 对象中的函数
interface User {
	name: string
	age: number
	sayHello1: () => void
	sayHello2(): void
}
// 约束函数 - 直接约束 
interface Condition {
	(n: number): boolean
}

接口的继承

interface A {
	T1: string
}
interface B extends A {
	T2: number
}
interface C extends A, B {
    T3: boolean;
}

你可能感兴趣的:(笔记,typescript)