any和unknown的区别
- any和unknown都是顶级类型。
- 任何类型都能赋值给any、unknown类型。
- any类型能赋值给任何类型,unknown类型只能赋值给any和unknown类型。
- any类型的值能执行任何操作(例:value.trim()、new value()),unknown不行:不再被认为是类型正确。
object, Object 和 {} 类型区别
- object表示非原始类型(除了string、boolean、number、bigint、symbol、null、undefined之外的类型)。
- Object是所有 Object 类的实例的类型,Object 接口定义了 Object.prototype 原型对象上的属性。
- {} 描述了一个没有成员的对象。
type和interface的区别
- type可以定义联合类型、基础类型别名、元组类型,interface不行。
- type名称重复是非法的,interface名称重复会合并。
- type和interface可以相互继承,type继承使用 & (交叉类型);interface继承使用extends。
any、unknown、never的联合和交叉
- any和任何类型联合都是any,any和任何非never类型交叉都是any。
- unknown和任何非any类型联合都是unknown,unknown和其他类型交叉都是其他类型。
- never和其他类型联合都是其他类型,unknown和其他类型交叉都是never。
常用工具类及实现
type Partial<T> = {
[P in keyof T]?: T[P] | undefined;
}
type Required<T> = {
[P in keyof T]-?: T[P];
}
type Readonly<T> = {
readonly [P in keyof T]: T[P];
}
type Record<K extends string | number | symbol, T> = {
[P in K]: T;
}
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
}
type Exclude<T, U>=T extends U ? never : T
type Extract<T, U>=T extends U ? T : never
type Omit<T, K extends string | number | symbol> = {
[P in Exclude<keyof T ,K>]: T[P];
}
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any
type Parameters<T extends (...args :any) => any> = T extends (...args: infer P) => any ? P : never