三个关键字

根据已知的信息,计算出新的类型

typeof

TS中的typeof,书写的位置,在类型约束的位置上!!
表示:获取某个数据的类型。

  1. let b: typeof a = "dsfdsf"// 我可以不知道a什么类型,但b一定和a的类型一致

当typeof作用于类的时候,得到的类型,是该类的构造函数

补充:现有类User,const u: User; 意思是u的类型是new User()出来的实例对象

如果我想把一个变量约束为类,该怎么写?

即: 要约束为该类的构造函数才行

  1. const cls: new (…args: any[]) => User
  2. const cls: typeof User
    1. function createUser(cls: typeof User): User {
    2. return new cls();
    3. }

    keyof

    可以作用于类、接口、类型别名,用于获取其他类型中的 所有成员名 组成的联合类型 ```typescript interface User { loginId: string loginPwd: string age: number pid: string gender: ‘男’ | ‘女’ }

function printUserProperty(obj: User, prop: keyof User){ console.log(obj[prop]); }

  1. <a name="p5LGl"></a>
  2. ## in
  3. 该关键字往往和keyof联用,限制某个索引类型(索引器)的取值范围
  4. ```typescript
  5. type Obj = {
  6. //[p: string]: string
  7. //约束下p名的范围
  8. [p in 'loginId' | 'loginPwd' | 'age']: string
  9. // 相当于是
  10. //loginId: string
  11. //loginPwd: string
  12. //age: string
  13. }
  14. const u: Obj = {}
  15. u.abc = "123"

与keyof联用:

  1. type UserReadonly = {
  2. //[p in keyof User]: string
  3. // 但是这个string太限制了,那该怎么写呢?
  4. readonly [p in keyof User]?: User[p]//这样写就比较万能了
  5. }

自己做的一个很丰富的针对类的类型演算: 泛型 + 索引器 + in + keyof + T[p]

  1. interface User_2 {
  2. loginId: string
  3. loginPwd: string
  4. age: number
  5. }
  6. interface Article {
  7. title: string
  8. content: string
  9. }
  10. type AnyPartialReadonly<T> = {
  11. readonly [p in keyof T]?: T[p]
  12. }
  13. const u: AnyPartialReadonly<User_2> = {
  14. loginId: '123wjw'
  15. }
  16. const a: AnyPartialReadonly<Article> = {
  17. title: '111',
  18. content: '222'
  19. }

预定义的类型演算

TS中预设的类型演算

  1. Partial<T>//将类型T中的成员变为可选
  2. Required<T>//将类型T中的成员变为必填
  3. Readonly<T>//将类型T中的成员变为只读; 它里面使用了 -?: 表示去掉可选,即为必填
  4. Exclude<T, U>//从T中剔除可以赋值为U的类型; 即剔除T与U的交集; 因为T/U经常为联合类型
  5. type Exclude<T, U> = T extends U ? never : T
  6. //ps: 这里的 extends 是指匹配
  7. Extract<T, U>//提取T中可以赋值为U的类型; 即保留T与U的交集
  8. type Extract<T, U> = T extends U ? T : never;
  9. NonNullable<T>//从T中剔除null和undefined
  10. ReturnType<T>//获取函数返回值类型; T为函数类型!不是函数名称!!
  11. type func = () => number
  12. type returnType = ReturnType<func>
  13. //或者这么写
  14. let a: ReturnType<typeof sum>;
  15. InstanceType<T>//获取构造函数类型new出来的实例类型; T为构造函数类型
  16. let u: InstanceType<typeof User>;
  17. //...还有很多可以看源码, commond+左键点击
  1. type twoParamsConstructor<T> = new (arg1: any, arg2: any) => T
  2. type Inst = InstanceType<twoParamsConstructor<User>>