三个关键字
typeof
TS中的typeof,书写的位置,在类型约束的位置上!!
表示:获取某个数据的类型。
let b: typeof a = "dsfdsf"// 我可以不知道a什么类型,但b一定和a的类型一致
当typeof作用于类的时候,得到的类型,是该类的构造函数
补充:现有类User,const u: User; 意思是u的类型是new User()出来的实例对象
如果我想把一个变量约束为类,该怎么写?
即: 要约束为该类的构造函数才行
- const cls: new (…args: any[]) => User
- const cls: typeof User
function createUser(cls: typeof User): User {return new cls();}
keyof
可以作用于类、接口、类型别名,用于获取其他类型中的 所有成员名 组成的联合类型 ```typescript interface User { loginId: string loginPwd: string age: number pid: string gender: ‘男’ | ‘女’ }
function printUserProperty(obj: User, prop: keyof User){ console.log(obj[prop]); }
<a name="p5LGl"></a>## in该关键字往往和keyof联用,限制某个索引类型(索引器)的取值范围```typescripttype Obj = {//[p: string]: string//约束下p名的范围[p in 'loginId' | 'loginPwd' | 'age']: string// 相当于是//loginId: string//loginPwd: string//age: string}const u: Obj = {}u.abc = "123"
与keyof联用:
type UserReadonly = {//[p in keyof User]: string// 但是这个string太限制了,那该怎么写呢?readonly [p in keyof User]?: User[p]//这样写就比较万能了}
自己做的一个很丰富的针对类的类型演算: 泛型 + 索引器 + in + keyof + T[p]
interface User_2 {loginId: stringloginPwd: stringage: number}interface Article {title: stringcontent: string}type AnyPartialReadonly<T> = {readonly [p in keyof T]?: T[p]}const u: AnyPartialReadonly<User_2> = {loginId: '123wjw'}const a: AnyPartialReadonly<Article> = {title: '111',content: '222'}
预定义的类型演算
TS中预设的类型演算
Partial<T>//将类型T中的成员变为可选Required<T>//将类型T中的成员变为必填Readonly<T>//将类型T中的成员变为只读; 它里面使用了 -?: 表示去掉可选,即为必填Exclude<T, U>//从T中剔除可以赋值为U的类型; 即剔除T与U的交集; 因为T/U经常为联合类型type Exclude<T, U> = T extends U ? never : T//ps: 这里的 extends 是指匹配Extract<T, U>//提取T中可以赋值为U的类型; 即保留T与U的交集type Extract<T, U> = T extends U ? T : never;NonNullable<T>//从T中剔除null和undefinedReturnType<T>//获取函数返回值类型; T为函数类型!不是函数名称!!type func = () => numbertype returnType = ReturnType<func>//或者这么写let a: ReturnType<typeof sum>;InstanceType<T>//获取构造函数类型new出来的实例类型; T为构造函数类型let u: InstanceType<typeof User>;//...还有很多可以看源码, commond+左键点击
type twoParamsConstructor<T> = new (arg1: any, arg2: any) => Ttype Inst = InstanceType<twoParamsConstructor<User>>
