Typescript学习(第三弹)

泛型

定义

不预先确定的数据类型,具体的类型在使用的时候才确定,把泛型理解为代表类型的参数

泛型函数

泛型函数类型

泛型接口

引用泛型接口要指定一个类型,否则会报错

或者在泛型接口里指定一个默认类型

泛型类

  • 泛型放在类的后面这样可以约束类的成员

  • 泛型不能应用于类的静态成员

  • 实例化泛型类

    • 实例化的时候可以显式的传入T的类型,那这个实例化再调用方法就会受到泛型的约束

    • 实例化的时候也可以不传入类型,这样实例化再调用的方法就可以传任意值

泛型约束

如果你顶一个一个函数函数,要直接调用一个length属性是会报错的

这个时候可以定义一个Length的类型接口,让T继承Length接口,这样T就受到了约束,T就一定会有Length的属性

这个时候函数输入的参数也必须有length属性

泛型的好处

  • 函数和类可以轻松的支持多种类型,增强程序的扩展性
  • 不必写多条函数重载,冗长的联合类型声明,增强代码可读性
  • 灵活控制类型之间的约束

类型检查机制

  • 定义:Typescript 编译器在做类型检查时,所秉承的一些原则,以及表现出的一些行为。
  • 作用:辅助开发,提高开发效率

类型推断

  • 不需要指定变量的类型(函数的返回值类型),Typescript可以根据某些规则自动的为其推断出一个类型

基础类型推断

  • 初始化变量
  • 设置函数默认参数
  • 确定函数返回值

最佳通用类型推断

  • 推断出一个可以兼容当前所有类型的通用类型

上下文类型推断

  • 根据事件绑定推断出事件类型

类型断言

  • 定义:用自己声明的类型覆盖类型推断

    可以自己定义一个接口,用as添加断言

类型兼容性

定义

  • 当一个类型Y可以被赋值给另一个类型X的时候,我们就可以说类型X兼容Y

  • X兼容Y:X(目标类型) = Y(源类型)

接口兼容性:

  • 成员少的兼容成员多的(鸭式辩型法)

函数兼容性

  • 参数个数:目标函数多于源函数

  • 可选参数和剩余参数

    • 固定参数可以兼容可选参数和剩余参数;
    • 可选参数不兼容固定参数和剩余参数(严格模式下,也可以在tsconfig里面修改配置);
    • 剩余参数兼容固定参数和可选参数
  • 参数类型:必须匹配

    • 但是参数如果是对象:成员多的会兼容成员少的(严格模式下);相互兼容(非严格模式,可以在tsconfig里面修改配置),也叫函数参数的双向协变
  • 返回值类型:目标函数必须与原函数相同,或为其子类型

枚举兼容性

  • 枚举类型和数字类型互相兼容
  • 枚举类型之间不兼容

类的兼容性

  • 静态成员和构造函数不在比较范围
  • 两个类具有相同的实例成员, 它们的实例相互兼容
  • 类中包含私有成员或受保护成员,只有父类和子类的实例相互兼容

泛型兼容性

  • 泛型接口:只有类型参数T 被接口成员使用时,才会影响兼容性

  • 泛型函数:定义相同,没有指定类型参数时就兼容

记忆口诀:

  • 结构之间兼容:成员少的兼容成员多的
  • 函数之间兼容:参数多的兼容参数少的

类型保护

  • 定义:在特定的区块中保证变量属于某种确定定的类型

创建区块的方法

  • instanceof :用instanceof来判断是否实例

  • typeof

  • in:用in来判断属性是否存在

  • 类型保护函数 特殊的返回值:arg is type(类型谓词)

高级类型

交叉类型(类型并集)

  • 含义:将多个类型合并为一个类型,新的类型将具有所有类型的特性
  • 应用场景:混入
    用&连接,取两个接口的并集

联合类型(类型交集)

  • 含义:类型并不确定,可能为多个类型中的一个
  • 应用场景:多类型支持
    • 对象联合类型,取对象方法的交集
  • 可区分的联合类型:结合联合类型和字面量类型的类型保护方法

字面量类型

  • 字符串字面量
  • 数字字面量
  • 应用场景:限定变量取值范围

索引类型

要点

  • keyof T(索引查询操作符) 类型T公共属性名的字面量联合类型
  • TK:对 象T的属性 K所代表的类型
  • 泛型约束

应用场景:

  • 从一个对象中选取某些属性的值

映射类型

  • 含义:从旧类型创建出新类型

应用场景

同态:只作用于T的属性

  • Readonly:将T的 所有属性变为只读
  • Partial:将T的所有 有属性变为可选
  • Pick<T,K>:选取以K光为属性的对象T的子集

  • Record<K,T>:创新属性为K的新对象,属性值的类型为T

条件类型

  • 含义:T extendsU?X:Y(如果类型T可以赋值给类型 U,那么结果类型就是X,否则就是 Y)

应用场景

  • Exclude<T,U>:从T中 过滤掉可以赋值给U的类型
  • Extract<T,U>:从T中抽取出可以赋值给U的类型
  • NonNullable:从T口中除去 undefined 和 null
  • ReturnType:获取函数的返回值类型
  // T extends U ? X : Y

type TypeName<T> =
    T extends string ? "string" :
    T extends number ? "number" :
    T extends boolean ? "boolean" :
    T extends undefined ? "undefined" :
    T extends Function ? "function" :
    "object";
type T1 = TypeName<string>
type T2 = TypeName<string[]>

// (A | B) extends U ? X : Y
// (A extends U ? X : Y) | (B extends U ? X : Y)
type T3 = TypeName<string | string[]>

type Diff<T, U> = T extends U ? never : T
type T4 = Diff<"a" | "b" | "c", "a" | "e">
// Diff<"a", "a" | "e"> | Diff<"b", "a" | "e"> | Diff<"c", "a" | "e">
// never | "b" | "c"
// "b" | "c"

type NotNull<T> = Diff<T, null | undefined>
type T5 = NotNull<string | number | undefined | null>

// Exclude<T, U>
// NonNullable<T>

// Extract<T, U>
type T6 = Extract<"a" | "b" | "c", "a" | "e">

// ReturnType<T>
type T8 = ReturnType<() => string>
  

总结

Typescript的基础分成了三篇,可以查看相关文章合集来巩固一下,再结合费曼学习法,加强记忆哦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值