四、TypeScript基础 | 青训营

89 阅读5分钟

一、什么是TypeScript

1.定义
  • TypeScript是微软开发的自由和开源的编程语言
  • TypeScript是JavaScript的一个超集,支持ECMAScript标准
2.TS与JS的关系

TypeScript本质上是向JavaScript上添加了可选的静态类型基于类的面向对象编程 在JS基础之上,为JS添加了类型支持。TypeScript=Type+JavaScript image.png

二、TypeScript的基础

1.类型注释
  • TS中定义变量(常量)可以指定类型
  • A类型的变量不能保存B类型的数据
//格式:
let 变量名:类型=初始值
//示例:
let age:number=18
2.数据类型
(1)JS已有类型
  • 原始类型:number/string/boolean/null/undefined/symbol
  • 对象类型:object(包括数组,对象,函数等对象)

其中数组有两种写法如下:

//写法一:
let 变量:类型[]=[值1,...]
//写法二:
let 变量:Array<类型>=[值1,...]
(2)TS新增类型
  • 联合类型

由两个或多个其他类型组成的类型,表示可以是这些类型中的任意一种

//格式:
let 变量:类型1|类型2|类型3...=初始值
//示例:
let arr:(number|string)[]=[1,'a',3,'b']
  • 自定义类型

类型别名:给类型起别名,定义了新类型

//定义:
type 别名=类型
//使用
type s=string //定义
const str1:s='abc'
const str2:string='abc'
  • 函数

格式

// 普通函数
function 函数名(形参1: 类型=默认值, 形参2:类型=默认值): 返回值类型 { }

// 箭头函数
const 函数名(形参1: 类型=默认值, 形参2:类型=默认值):返回值类型 => { }

示例

// 函数声明
function add(num1: number, num2: number): number {
  return num1 + num2
}

// 箭头函数
const add = (num1: number=10, num2: number=20): number => {
  return num1 + num2
}

add(1,'1') // 报错
  • 接口

格式

interface 接口名  {
    属性1: 类型1, 属性2: 类型2,
}

示例

interface IGoodItem  {
    name: string, price: number, func: ()=>string
}


const good1: IGoodItem = {
    name: '手表',
    price: 200,
    func: function() {
        return '看时间'
    }
}

const good2: IGoodItem = {
    name: '手机',
    price: 2000,
    func: function() {
        return '打电话'
    }
}

接口和类型的区别:

相同点:都可以给对象指定类型

不同点:

  接口,只能为对象指定类型,并且可以继承
  类型别名,可以为任意类型指定别名
  • 元组

元组是另一种特殊的数组,可以确切地包含多少个元素,并且可以特定索引对应的类型

//示例:
let position: [number, number] = [39.5427, 116.2317]
  • 字面量类型

image.png

  • 枚举

它是用来描述一个值,该值只能是一组命名常量的一个

格式

enum 枚举名 { 可取值1,可取值2,.. }

示例

// 定义枚举类型
enum Direction { Up, Down, Left, Right }

// 使用枚举类型
function changeDirection(direction: Direction) {
  console.log(direction)
}

// 调用函数时,需要应该传入:枚举 Direction 成员的任意一个
// 类似于 JS 中的对象,直接通过 点(.)语法 访问枚举的成员
changeDirection(Direction.Up)
  • void

当函数满足以下三种情况则没有返回值,使用void类型

  1. 无return
  2. 有return,但后不接内容
  3. 有return undefined
  • any

三、TypeScript的进阶

在TypeScript中我们会使用泛型来对函数的相关类型进行约束。

1.什么是泛型

泛型是指在定义函数接口时,可以不预先指定其具体的类型,而在使用的时候再指定类型的一种特性。

2.通俗的理解泛型
  • 使用泛型前
image.png image.png image.png

该print函数只能先定义了传入参数和返回参数的类型后,根据指定类型进行使用。

  • 使用泛型后
image.png

使用了泛型后,该print函数支持任意类型的传入参数和返回参数

3.泛型函数

目标:声明一个函数,接收一个参数,接收什么参数返回什么值

function getValue<T>(value: T): T {
	return value;
}

getValue<string>("hello");
getValue<number>(100);

//  泛型实参可以忽略   你传递的参数的类型就是要传递的泛型的类型
echo("hello")
4.泛型类

目标:通过类创建对象,对象key属性可以是字符串,也可以是数值,对象的value属性可以是字符串也可以是数值

class KeyValuePair<K, V> {
	constructor(public key: K, public value: V){}
}
6.泛型接口

目标:创建fetch方法用于获取数据,当获取用户数据时,fetch方法的返回值类型为用户,当获取产品数据时fetch方法的返回值类型为产品,不论是用户数据还是产品数据,都要被包含在响应对象中

interface MyResponse<T> {
	data: T | null;
}

function fetch<T>(): MyResponse<T> {
	return {data: null};
}

interface User {
	username: string;
}

interface Product {
	title: string;
}

fetch<User>().data?.username;
fetch<Product>().data?.title;
7.泛型约束

泛型约束是指对泛型参数的范围进行约束

// 限制类型 T 的范围  就是说  T  的类型要么是字符串要么是数值  其他的是不可以的
class StringOrNumberArray<T extends string | number> {
	constructor(public collection: T[]) {}
	get(index: number): T {
		return this.collection[index];
	}
}

new StringOrNumberArray<string>(["a", "b"])
new StringOrNumberArray<number>([100, 200])

// 类型  boolean  不满足约束  string | number
// new StringOrNumberArray<boolean>([true, false]);
8.继承泛型类
class Store<T> {
	protected _objects: T[] = [];
	add(obj: T) {
		this._objects.push(obj);
	}
}

interface Product {
	name: string;
	price: number;
}
const store = new Store<Product>();
class CompressibleStore<T> extends Store<T> {}
new CompressibleStore<Product>();
clsaa ProductStore extends Store<Product> {}
9.泛型的基本操作符
  • typeof:获取类型
  • keyof:获取所有键
  • in:遍历枚举类型
  • T[K]:索引访问
  • extends:泛型约束
10.泛型的常用工具类型
  • Partial:将类型属性变为可选
  • Required:将类型属性变为必选
  • Readonly:将类型属性变为只读
  • Pick、Record...

四、TypeScript的声明文件

  • declare:三方库需要类型声明文件
  • .d.ts:声明文件定义
  • @types:三方库TS类型包
  • tsconfig.json:定义TS的配置