在学习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; //可赋值
```