TypeScript入门 | 青训营笔记

82 阅读4分钟

TypeScript入门

这是我参与「第四届青训营 」笔记创作活动的的第11天

1.重点内容

TypeScript的入门

2.重要的知识点

什么是TypeScript?

TypeScript的基础数据类型

函数类型

函数重载

数组类型

TypeScript补充类型

泛型

类型别名 & 类型断言

字符串|数字 字面量

联合/交叉类型

类型保护与类型护卫

函数返回值的类型

工程运用

3.详尽的知识点

什么是TypeScript?

  • Typescript是静态类型的编程语言,包含于兼容所有的js特性,支持ts,js共存,同时支持渐进式引入和升级
  • 可读性增强,基于语法解析TSDos,IDE增强
  • 可维护性增强,在编译阶段暴露大部分问题,有利于在多人合作的大型项目中,获得更好的稳定性和开发效率

TypeScript的基础数据类型

定义变量时在变量名后添加数据类型的说明。

//js
const str = 'string'
//ts
const str: string = 'string'

对象自定义类型

interface IClassname {
    //只读属性
    readonly ID: number;
    name: string;
    gender: 'man' | 'woman' | 'other';
    age: number;
    //可选属性
    hobby?: string;
    //任意属性
    [key: string]:any;
}

对象实例化

const card: IClassname = {
    id: 114514,
    name: 'Bob',
    gender: 'man',
    age: 24,
}

可以加任意属性

card.address = 'China'

只读属性无法更改值,实例化时必填属性缺失会报错。

函数类型

//js
function add(x,y) {
    return x+y
}
//ts
function add(x: number,y: number): number {
    return x+y
}
//js
const mult = (x,y) => x*y
//ts
const mult: (x: number,y: number) => number = (x,y) => x*y
//ts
interface IMult {
    (x: number,y: number): number;
}
const mult: IMult = (x,y) => x*y

函数重载

通过对传入数据类型的判断来决定输出的数据类型。

数组类型

  1. 类型+方括号表示
  2. 泛型表示
  3. 元组表示
  4. 接口表示
type IArr1 = number[];
type IArr2 = Array<string | number | Record<string, number>>;
type IArr3 = [number, number, string, string];
interface IArr4 {
    [key: number]: any;
}

TypeScript补充类型

  • 空类型,表示无赋值
  • 任意类型,是所有类型的子类型
  • 枚举类型,支持枚举值到枚举名的正反映射
  • 泛型
type IEmptyFunction = () => void;
type IAnyType = any;
enum EnumExample {
    add = '+',
    mult = '*',
}
type INumArr = Array<number>;

泛型

在开发中要考虑代码的复用性,因此需要使用泛型来创建可复用的组件,这使得同一个组件可以支持多种类型的使用。泛型将不确定的类型变成参数,用T表示。

function fun<T>(arg: T): T {
    return arg
}

此时的T代表的是类型变量,即不预先指定具体的类型,而是在使用的时候再进行指定,也可以理解为先搭好框架,然后在使用时再往里添加具体的参数。

泛型接口 & 多泛型 | 泛型类 | 泛型别名

interface IX<T,U> {
    key: T;
    val: U;
}class IMan<T> {
    instance: T;
}
​
type ITypeArr<T> = Array<T>;

泛型约束

限制泛型的类型,以字符串为例

type IArr = <T extends string>(arg: T) => T[]

默认泛型

默认泛型的数据类型,以数字为例

type IArr<T = number> = (arg: T) => T[]

类型别名 & 类型断言

类型别名:使用type关键字定义别名类型,使用IObjArr来代替后面复杂的类型说明,简化代码数量。

type IObjArr = Array<{
    key: string;
    [objKey: string]: any;
}>

类型断言:使用as关键字对变量进行断言,即开发者已经明确最后变量的数据类型时,可以使用断言来标记变量。以keyBy函数为例。

function keyBy<T extends IObjArr>(objArr: Array<T>) {
    const result = objArr.reduce((res, val, key) => {
        res[key] = val;
        return res;
    },{});
    return result as Record<string, T>;
}

字符串|数字 字面量

type ITag = 'html' | 'body' | 'duv';
type INumber = 1 | 3 | 5 | 7;

联合/交叉类型

一开始学习ts,会因为其繁琐的数据类型说明而烦恼。但是我们可以通过类型的联合和交叉来简化类型说明的代码。

  • 联合类型

    • IA | IB
    • 值可以是几种类型之一
  • 交叉类型

    • IA & IB
    • 多种类叠加一起,包含所需的所有类型

类型保护与类型护卫

在使用联合类型的时候,仅能访问联合类型中的交集部分。即仅能访问两者中都拥有的部分。

此时如果我们有对应的需求,则需要使用类型守卫。

类型守卫就是通过定义一个函数,其返回的值是一个类型谓词,生效范围为子作用域。

  • typeof类型保护
  • instance类型保护

联合类型+类型保护 = 自动类型推断

函数返回值的类型

  • extends

    • 当跟随泛型出现时,表示推断,可类别三元运算符
  • infer

    • 出现在类型推荐中,表示定义类型变量,用于指代类型

工程运用

  • web

    • 配置webpack loader相关配置
    • 配置tsconfig.js文件
    • 运行webpack启动/打包
    • loader处理ts文件,进行编译和检查
  • node

    • 安装node和npm
    • 配置tsconfig.js文件
    • 使用npm安装tsc
    • 使用tsc运行编译得到js文件

4.课后总结

TypeScript作为现在流行的前端语言,在实际开发中非常常见,因此学习typescript是非常有必要的。作为js的超集,在初学的时候必然会遇到困难,会因为复杂的语法规则而烦恼。但是只要厘清关系,同时作为有js基础的开发者来说,ts还是比较容易上手的。