深入TypeScript | 青训营笔记

75 阅读3分钟

一、TypeScript基础

基础类型

TyprScript中声明变量时,需要进行类型的标注。比如

let a: number = 1
let b: string = "hello"

如果定义了类型的变量赋值其他类型的变量,是会报错的,比如

let b: number = 'hello`

b变量希望接收一个数字类型的值,却得到了一个字符串,此时编译ts代码时tsc会报错。

函数类型

在定义函数的时候,需要对函数的参数和返回值进行类型标注。

function add(a: number, b: number): number {
    return a + b
}

这就要求函数在使用的时候传入的两个参数必须都是数字类型。

interface

在定义对象的时候,一般还会对对象的属性进行要求。通过interface来限制对象的属性类型

interface Person {
    name: string
    age: number
}

let p: Person = {
    name: 'Jack',
    age: 20
}

二、类型进阶

联合类型与交叉类型

联合类型的变量可以同时拥有两种类型

let num: number | string
num = 8
number = 'hello'

交叉类型类似于继承

interface Person {
    name: string
    age: number
}

type Student = Person & {grade: number}

let stu: Student
stu.name = 'Jack'

同时在IDE中编写代码时还可以发现stu变量同时拥有了三个提示,这也是TS带来的好处之一:优秀的代码提示功能。使用TypeScript编写的VSCode能够提供优秀的代码提示就是这个原因。

type和interface的区别

TS中interface是定义对象类型的主要方式,而type则主要用来定义别名。除此之外,两者还有其他区别

  • interface可以重复声明,但是type不行。
  • interface不能定义基本类型,但是type可以。

泛型

泛型可以理解为一个占位符,它占的是类型声明的位置。例如编写一个函数时我们并不确定传入的参数是什么,希望在使用函数的时候来指定,泛型就有这个用处。比如下面的例子。

function printArray<T>(arr: T[]) {
  for (let i = 0; i < arr.length; i++) {
    console.log(arr[i]);
  }
}
const arr1 = ["foo", "bar", "baz"];
printArray<string>(arr1); // 输出 "foo", "bar", "baz"

const arr2 = [1, 2, 3, 4];
printArray<number>(arr2); // 输出 1, 2, 3, 4

泛型还有许多相关的API,比如获取泛型的类型,获取所有的key等。

三、TS实战相关

首先是一些常见项目中关于TS的文件。

  1. declare: 第三方库需要类型声明文件。
  2. d.ts: 声明文件定义。
  3. @types: 一般是第三方库的TS版本。
  4. tsconfig.json: TS的配置文件。

##四、总结

TypeScript作为JavaScript的超集,引入了类型系统,提高了代码的可维护性,同时还带来了良好的代码提示功能。例如Vue3这类有名的项目,都已经是官方使用TS来进行源码的编写了,所以TS在大型项目上的优势也得到了广泛认可。 而且还有一个原因,TS虽说引入了类型系统,但是它的开发体验和JS相比并没有发生翻天覆地的变化。虽说精通TS很难(类型体操要我狗命),但是对于一个经常写JS的人来说,想要快速上手TS还是比较简单的。