邂逅TypeScript | 青训营笔记

61 阅读3分钟

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

TypeScript 基本语法

为什么是TypeScript

  • JS

    • 动态类型(执行阶段完成类型的匹配)

    • 弱类型语言

  • TS

    • 静态类型(提前完成类型的匹配)

      • 可读性增强:基于语法解析TSDoc,ide增强
      • 可维护性增强:在编译阶段暴露大部分错误
    • 弱类型语言

    • JS的超集

      • 包含于兼容所有JS特性,支持共存
      • 支持渐进式引入与升级

基本语法

变量类型

const 变量名:变量类型 = '变量值';

// 字符串
const str: string = 'string';
// 数字
const num: number = 123;

interface接口

interface inter {
    // 只读属性:属性只能在对象初始化时赋值*/
    // 必填
    readonly id: number;
    name: string;
    sex: 'man' | 'woman' | 'other';
    age: number;
    // 可选
    hobby?: string;
    // 任意属性:约束所有对象属性都必须是该属性的子类型
    [key : string]: any;
}

函数

函数类型
interface IMult {
    (x: number, y: number): number;
    // 参数类型            返回值类型
}
const mult:IMult = (x, y) => x * y;
函数重载

在同一个作用域中,如果有多个函数的名字相同,但是形参列表不同(参数类型不同或参数个数不同),返回值类型可同也可不同,称之为重载函数。

重载的函数是通过形参列表区分的,与返回值类型无关。函数重载其实是"一个名字,多种用法"的思想,不仅函数可以重载,运算符也可以重载。

数组类型

// 通常表示
type Arr1 = number[];
// 泛型表示
type Arr2 = Array<string | number | Record<string, number>>;
// 元组表示
type Arr3 = [number, number, string, string];
// 接口表示
interface Arr4 {
    [key: number]: any;
} 

泛型

不预先指定具体类型

// <>中的内容为泛型
// 泛型接口 & 多泛型
interface X<T , U> {
    key: Y;
    VAL: u;
}
// 泛型类
class Man<T> {
    instance: T;
}
// 泛型别名
type TypeArr<T> = Array<T>;

字符串/数字 字面量

// 指定字符串/数字必须的固定值
// htmlDom必须为html、 body、 div、 span中的一个
type htmlDom = 'heml' | 'body' | 'div' | 'span';
// OddNumber必须为1、3、5、7、9中的一个
type OddNumber = 1 | 3 | 5 | 7 | 9

TypeScript 高级数据类型

联合/交叉类型

  • 联合类型:IA | IB;联合类型表示一个值可以是几种类型之一

    • T | U
    • 其返回类型为连接的多个类型中的任意一个
  • 交叉类型:IA | IB;多种类型叠加到一起成为一种类型,包含了所需所有类型的特性

    • T & U
    • 其返回类型既要符合 T 类型也要符合 U 类型

高级类型

  • 类型约束

    • T extends K
    • 这里的 extends 不是类、接口的继承,而是对于类型的判断和约束,意思是判断 T 能否赋值给 K
  • 类型映射(in)

    • 会遍历指定接口的 key 或者是遍历联合类型
  • 类型谓词

    • parameterName is Type
    • parameterName 必须是来自于当前函数签名里的一个参数名,判断 parameterName 是否是 Type 类型。
  • 待判断类型

    • 用 infer P 来标记一个泛型,表示这个泛型是一个待推断的类型,并且可以直接使用
  • 原始类型保护

    • typeof v === "typename"` or `typeof v !== "typename"
      
    • 用来判断数据的类型是否是某个原始类型(numberstringbooleansymbol)并进行类型保护
    • "typename"必须是 "number", "string", "boolean"或 "symbol"。 但是 TypeScript 并不会阻止你与其它字符串比较,语言不会把那些表达式识别为类型保护。
  • 类型保护

    • instanceof

    • nstanceof 的右侧要求是一个构造函数,TypeScript 将细化为:

      • 此构造函数的 prototype 属性的类型,如果它的类型不为 any 
      • 构造签名所返回的类型的联合