[深入理解typescript|青训营笔记]

102 阅读2分钟

前言
记录青训营前端专场的学习过程,有不足的地方还请大佬指正。
由于本人基础比较薄弱,所以笔记尽可能的详细。

该文章开始的版本将以简述课程知识点为主,等后面实践有自己的理解后会编辑添加自己的理解

Typescript vs javascript

tpescriptjavascript
jvascript的超集,用于解决大型项目的代码复杂性一种脚本语言,用于创建动态网站
强类型,支持静态和动态类型动态弱类型语言
可以在编译期间,发现并纠正错误只能在运行时发现错误
不允许改变变量的数据类型变量可以被赋值不同类型

TS基础数据类型

  • boolean、number、string
  • undefined、null
  • any、unknown、void
  • never
  • 数组类型[]
  • 元祖类型tuple

TS函数类型

  • 定义:TS函数定义时要定义输入参数类型和输出参数类型
  • 输入参数:参数支持可选参数和默认参数
  • 输出参数:输出可以自行推断,没有返回值,默认为void类型
  • 函数重载:名称相同但参数不同,可以通过重载支持多种数据类型
//函数重载
function add(x: number[]) : number
function add(x: string[]) : string

TS的interface类型

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

  • 可选属性
interface Person {
  name: string;
  age?: number; // 可选属性
}

const person1: Person = {
  name: "Alice"
};

const person2: Person = {
  name: "Bob",
  age: 25
};
  • 只读属性
interface Point {
  readonly x: number; // 只读属性
  readonly y: number;
}

const point: Point = {
  x: 10,
  y: 20
};

point.x = 5; // Error: 无法分配到 "x" ,因为它是只读属性。
  • 可以描述函数类型
interface MathFunction {
  (x: number, y: number): number; // 函数类型
}

const add: MathFunction = (x, y) => {
  return x + y;
};

const subtract: MathFunction = (x, y) => {
  return x - y;
};
  • 可以描述定义属性
interface Book {
  title: string;
  author: string;
  pages: number;
}

const book: Book = {
  title: "The TypeScript Handbook",
  author: "John Doe",
  pages: 200
};

typescript高阶

联合类型

联合类型允许一个值具有多种可能的类型。通过使用竖线 | 将多个类型列在一起,表示一个值可以是这些类型中的任意一个。

function printId(id: number | string) {
  console.log(id);
}

printId(123); // 输出:123
printId("abc"); // 输出:"abc"

交叉类型

交叉类型允许一个值同时具有多个类型的特性。通过使用 & 运算符将多个类型合并在一起,表示一个值具有这些类型的联合。

type Point = { x: number; y: number };
type Color = { color: string };

function draw(point: Point & Color) {
  console.log(`Drawing at (${point.x}, ${point.y}) with color ${point.color}`);
}

draw({ x: 10, y: 20, color: 'red' }); // 输出:Drawing at (10, 20) with color red

类型断言

类型断言允许开发者手动指定一个值的类型,即告诉编译器某个值的实际类型,类似于类型转换。可以使用尖括号语法 <Type> 或者 as 关键字进行类型断言。

let value: any = "Hello TypeScript";

// 尖括号语法
let length1: number = (<string>value).length;

// as 关键字
let length2: number = (value as string).length;

console.log(length1); // 输出:17
console.log(length2); // 输出:17

类型别名

类型别名允许为现有类型创建一个新名称,可以使用类型别名来提高代码的可读性和重用性。示例代码如下:

type ID = number | string;
type Point = { x: number; y: number };
type Coordinate = [number, number];

function printId(id: ID) {
  console.log(id);
}

function draw(point: Point) {
  console.log(`Drawing at (${point.x}, ${point.y})`);
}

function move(coordinate: Coordinate) {
  console.log(`Moving to (${coordinate[0]}, ${coordinate[1]})`);
}

printId(123); // 输出:123
draw({ x: 10, y: 20 }); // 输出:Drawing at (10, 20)
move([30, 40]); // 输出:Moving to (30, 40)