理解TypeScript里的一些类型专业名词

275 阅读3分钟

在学习ts的过程中,我们会遇到很多关于类型的新概念已经新名词,这里记录一下这些名词各自的意义

1.类型别名

将一组类型/类型结构封装,作为一个新的类型
type A = string;

2.工具类型

在类型别名的基础上,基于泛型去动态创建新类型 type Factory<T> = T | number | string;

工具类型就像一个函数一样,泛型是入参,内部逻辑基于入参进行某些操作,再返回一个新的类型。比如在上面这个工具类型中,我们就简单接受了一个泛型,然后把它作为联合类型的一个成员,返回了这个联合类型。

3.联合类型

创建一组类型集合,满足其中一个类型即满足这个联合类型(||)
type b = number|string|boolean;

4.交叉类型

创建一组类型集合,满足其中所有类型才满足映射联合类型(&&)
类似联合类型的符号是|,它代表了按位或,即只需要符合联合类型中的一个类型,既可以认为实现了这个联合类型,如A | B,只需要实现 A 或 B 即可。

而代表着按位与的 & 则不同,这里需要符合这里的所有类型,才可以说实现了这个交叉类型,即 A & B需要同时满足 A 与 B 两个类型才行。

interface a { name: string; } interface b { age: number; } type c = a & b;

5.索引签名类型

声明一个拥有任意属性,键值类型一致的接口结构
interface a { [key: string]: string; } type b = a['599']; // string

6. 索引类型查询

它将对象中的所有键转换为对应字面量类型,然后再组合成联合类型 type a = keyof Foo;

7. 索引类型访问

通过 obj[expression] 的方式来动态访问一个interface类型

8.映射类型

基于键名映射到键值类型

type typeMap<T> = {
  [K in keyof T]: string;
};   
interface Foo { 
    prop1: string;
    prop2: number;
    prop3: boolean; 
    prop4: () => void;
}
type a = typeMap<Foo>;
// 等价于 
interface a { 
    prop1: string; 
    prop2: string; 
    prop3: string; 
    prop4: string; 
}

9. extends 关键字

用于接口,表示继承

interface T1{
  name: string;
}
interface T2{
  sex: number;
}

// T3 = {name: string; sex: number; age:number;}
interface T3 extends T1,T2{
  age: number,
}

10.协变 逆变

协变与逆变(Convariance and contravariance)是在计算机科学中,描述具有父/子型别关系的多个型别通过型别构造器、构造出的多个复杂型别之间是否有父/子型别关系的用语。
具有父子关系的多个类型,在通过某种构造器构造成的新的类型,如果还具有父子关系则是协变,而关系逆转了(子转父,父转子)就是逆变。

协变
interface Animal {
  name: string;
}
interface Dog extends Animal {
  break(): void;
}

let Eg1: Animal;
let Eg2: Dog;
// 兼容,可以赋值
Eg1 = Eg2

let Eg3: Array<Animal>
let Eg4: Array<Dog>
// 兼容,可以赋值
Eg3 = Eg4   

```
逆变
interface Animal {
  name: string;
}

interface Dog extends Animal {
  break(): void;
}

type AnimalFn = (arg:Animal) => void
type DogFn = (arg: Dog) => void

let Eg1: AnimalFn;
let Eg2: DogFn;

Eg1 = Eg2; // 不可赋值
Eg2 = Eg1; //可赋值
```

这篇博客记录了自己在学习typescript的过程中遇到类型相关的名词的概念的总结,参考链接:

juejin.cn/book/708640…
www.jianshu.com/p/c1e5384d6…