之前工作中对于ts的使用都是一些接口,泛型定义,继承之类的,某一天的突然想看看这些东西,才发现ts有这么多功能
declare 声明
declare用来在.d.ts文件里面进行全局的声明
当开发项目中全局引入来一些模块或者方法之类,在其他页面使用ts会报错没有找到,这个时候需要再.d.ts的文件里面用declare来声明一下;
declare var dd: any;
type与interface
type可用于给类型起新的名字,或者创建一些工具
type N = number;
type NS = number | string;
type IPartial<T> = { [K in keyof T]?: T[K] };
interface 只能定义接口类型
type类型的合并使用 & 交叉
type Foo = {
name: string;
}
type Too = Foo & {
age: number;
};
interface类型的合并需要是extends
interface Foo {
name: string;
}
interface Too extends Foo {
age: number;
};
extends
首先是extends,之前对于extends的理解就只是类型的继承,extends用于对类型的约束限制才更加合适
例如在用作接口继承时,可以理解为约束当前接口类型必须拥有继承对象的属性类型
下面这个是ts的条件类型,用extends判断K
再比如像下面Pick的实现,传入一个泛型,再传入一些属性值,用extends约束K的属性必须在T的约束范围内,
type Pick<T, K extends keyof T> = { [P in K]: T[P]; }
keyof & in
keyof
产生联合类型, in
则可以遍历枚举类型
Partial 把类型的所有属性变成可选
type Partial<T> = { [P in keyof T]?: T[P] | undefined; }
传入一个类型,keyof提取出所有key,用in循环
Required 把类型的所有属性变成必选
type Required<T> = { [P in keyof T]-?: T[P]; }
我们发现一个有意思的用法 -?
, 这里很好理解就是将可选项代表的 ?
去掉
Record 将类型中的所有属性转行为指定类型
type Record<K extends string | number | symbol, T> = { [P in K]: T; }
传入一个联合类型,再传入一个指定的类型,可以是接口类型等
Pick 从类型中抽取部分属性出来组成新的类型
type Pick<T, K extends keyof T> = { [P in K]: T[P] };
Omit 找出类型A 不在类型B的属性
type Omit<T, K extends string | number | symbol> = { [P in Exclude<keyof T, K>]: T[P]; }
这里用到了Exclude这个方法,这个方法可以过滤出类型A属性不在类型B中的那部分属性,然后用in循环,取出不在类型B的属性