三个关键字
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联用,限制某个索引类型(索引器)的取值范围
```typescript
type 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: string
loginPwd: string
age: number
}
interface Article {
title: string
content: 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和undefined
ReturnType<T>//获取函数返回值类型; T为函数类型!不是函数名称!!
type func = () => number
type 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) => T
type Inst = InstanceType<twoParamsConstructor<User>>