深入浅出TypeScript

211 阅读4分钟

一、为什么要学习ts

ts vs js

TypeScript 是 JavaScript 的超集,它包含了 JavaScript 的所有元素,可以载入 JavaScript 代码运行,并扩展了 JavaScript 的语法。TypeScript 增加了静态类型、类、模块、接口和类型注解等特性。TypeScript 代码需要通过编译器编译为 JavaScript,然后再交由 JavaScript 解析器执行。

二、ts基础

ts数据类型

number 类型用于表示数字,可以是整数或浮点数。例如:let num: number = 123;

string 类型用于表示字符串,可以使用单引号或双引号来定义。例如:let str: string = 'hello';

boolean 类型用于表示布尔值,只有两个值:true 和 false。例如:let isTrue: boolean = true;

nullundefined 分别表示空值和未定义。它们的类型分别为 null 和 undefined。例如:let n: null = null; let u: undefined = undefined;

symbol 类型表示独一无二的值。例如:let sym1 = Symbol(); let sym2 = Symbol('key');

数组 类型用于表示一组相同类型的值。可以使用 类型[] 或 Array<类型> 来定义。例如:let arr1: number[] = [1, 2, 3]; let arr2: Array = [1, 2, 3];

对象 类型用于表示一个对象,可以使用接口或类型别名来定义对象的类型,与C语言的结构体相似。

元组(Tuple)类型用来表示一个已知元素数量和类型的数组,各元素的类型不必相同。例如,你可以定义一个元组,它包含一个 string 类型元素和一个 number 类型元素:

let tuple: [string, number];
tuple = ['hello', 123]; // OK
tuple = [123, 'hello']; // Error
函数类型

定义:TS需要定义函数的i/o类型。

输入参数:执行hi默认和可选

输出参数:自动判断输出,默认void

函数重载:可以通过此支持同名不同参

这里解释下老师课上说的函数重载:

函数重载是指根据参数的类型执行不同的函数。多数用于传入不同的参数得到不同的结果。重载分为两个部分(缺一不可):声明和实现。

举个例子,假设我们有一个函数,可以接收string类型相拼接,也可以接收number类型相加。

有一个函数叫做double,它可以接收number类型并返回它的两倍,也可以接收string类型并返回它与自身拼接的结果。

Interface

定义:接口是为了定义对象类型

特点:

可选属性: 几乎等于没有

只读属性: readonly

可以描述函数类型&描述自定义属性

总结:接口非常灵活

类 Class
  • 写法和JS差不多,增加了public、 private、 protected修饰符
  • 特点:
    • 抽象类:
      • 只能被继承,不能被实例化
      • 作为基类,抽象方法必须被子类实现

TS进阶

基础类型&interfacetype的异同

联合类型 |

交叉类型 &

类型断言 as !

类型别名(type VS interface) 定义:给类型起个别名 (类似于c++的引用)

相同点: 都可以定义对象或函数 都允许继承

差异点: interface是 TS 用来定义对象,type 是用来定义别名方便使用; type 可以定义基本类型,interface 不行 ; interface 可以合并重复声明,type 不行;

About泛型(个人理解)

在 TypeScript 中,也可以使用泛型来创建可重用的组件。具体来说,泛型就是在定义函数、接口或类时,使用参数来代替具体的类型。

例如,下面是一个简单的泛型函数示例,用于交换任意两个元素的位置:

function swap<T>(a: T, b: T): void {
  let temp: T = a;
  a = b;
  b = temp;
}

// 使用泛型函数
let x: number = 1, y: number = 2;
swap<number>(x, y); // 交换 x, y 的值
console.log(x, y); // 2, 1

在上面的示例中, 表示这是一个泛型函数,T 表示泛型参数。在使用该函数时,需要指定具体的类型,例如 swap(x, y)。

除了函数外,接口和类也可以使用泛型参数。例如,下面是一个使用泛型参数的接口示例:

interface Box<T> {
  value: T;
}

let box: Box<string> = { value: "Hello World" };
console.log(box.value); // "Hello World"

在上面的示例中,Box 表示一个拥有 value 属性的泛型接口,使用时需要指定具体的类型,例如 Box。这样,我们就可以创建一个字符串类型的盒子。

泛型可以带来很多好处,例如提高代码的重用性、泛化数据结构等等。

一些常用的TS(来自青训营的“安酱”大佬的笔记)(自己只听了内容懒得回去截TTT)

泛型工具类型-基础操作符:

  • typeof:获取类型
  • keyof:获取所有键
  • in:遍历枚举类型
  • T[k]:索引访问
  • extends:泛型约束