交叉类型与联合类型

交叉类型:取所有类型的并集

联合类型:声明的类型并不确定,可以为多个类型中的一个

  1. interface DogInterface {
  2. run(): void
  3. }
  4. interface CatInterface {
  5. jump(): void
  6. }
  7. let pet: DogInterface & CatInterface = {
  8. run() {},
  9. jump() {}
  10. }
  11. let aas: number | string = 'a'
  12. let bbs: 'a' | 'b' | 'c'
  13. let ccs: 1 | 2 | 3
  14. class Dogs implements DogInterface {
  15. run() {}
  16. eat() {}
  17. }
  18. class Cats implements CatInterface {
  19. jump() {}
  20. eat() {}
  21. }
  22. enum Master { Boy, Girl }
  23. function getPet(master: Master) {
  24. let pet = master === Master.Boy ? new Dogs() : new Cats()
  25. pet.eat()
  26. return pet
  27. }
  28. interface Square {
  29. kind: "square";
  30. size: number;
  31. }
  32. interface Rectangle {
  33. kind: 'rectangle';
  34. width: number;
  35. height: number;
  36. }
  37. interface Circle {
  38. kind: 'circle',
  39. r: number
  40. }
  41. type Shape = Square | Rectangle | Circle
  42. function area(s: Shape) {
  43. switch (s.kind) {
  44. case "square":
  45. return s.size * s.size
  46. case "rectangle":
  47. return s.height * s.width
  48. case "circle":
  49. return Math.PI *s.r ** 2
  50. default:
  51. return ((e: never) => {throw new Error(e)})(s)
  52. }
  53. }
  54. console.log(area({kind: 'circle', r: 1}))

索引类型

  1. let objone = {
  2. a: 1,
  3. b: 2,
  4. c: 3
  5. }
  6. // function getValues(obj: any, keys: string[]) {
  7. // return keys.map(key => obj[key])
  8. // }
  9. function getValues<T, K extends keyof T>(obj: T, keys: K[]): T[K][] {
  10. return keys.map(key => obj[key])
  11. }
  12. console.log(getValues(objone, ['a', 'b']))
  13. console.log(getValues(objone, ['e', 'f']))
  14. // keyof T 索引类型的查询操作符
  15. interface Obj {
  16. a: number,
  17. b: string
  18. }
  19. let key: keyof Obj
  20. // T[K]
  21. let value: Obj['a']
  22. // T extends U

映射类型

  1. interface Obj {
  2. a: string;
  3. b: number;
  4. c: boolean;
  5. }
  6. // 所有接口属性只读
  7. type ReadonlyObj = Readonly<Obj>
  8. // 所有接口属性可选
  9. type PartialObj = Partial<Obj>
  10. // 抽取绑定的子集
  11. type PickObj = Pick<Obj, 'a' | 'b'>
  12. // 以上三种映射类型,官方统称同态,只会作用于obj的属性,不会引入新的属性
  13. // 非同态的
  14. type RecordObj = Record<'x' | 'y', Obj>

条件类型

由条件表达式所决定的类型

  1. // T extends U ? X : Y
  2. type TypeName<T> =
  3. T extends string ? 'string' :
  4. T extends number ? 'number' :
  5. T extends boolean ? 'boolean' :
  6. T extends undefined ? 'undefined' :
  7. T extends Function ? 'function' :
  8. "object";
  9. type T1 = TypeName<string>
  10. type T2 = TypeName<string[]>
  11. // (A | B) extends U ? X : Y
  12. // (A extends U ? X : Y) | (B extends U ? X : Y)
  13. type T3 = TypeName<string | string[]>
  14. type Diff<T, U> = T extends U ? never : T
  15. type T4 = Diff<"a" | "b" | "c", "a" | "e">
  16. // Diff<"a", "a" | "e"> | Diff<"b", "a" | "e"> | Diff<"c", "a" | "e">
  17. // never | "b" | "c"
  18. // "b" | "c"
  19. type NotNull<T> = Diff<T, undefined | null>
  20. type T5 = NotNull<string | number | undefined | null>
  21. // Exclude<T, U>
  22. // NonNullable<T>
  23. // Extract<T, U>
  24. type T6 = Extract<"a" | "b" | "c", "a" | "e">
  25. // ReturnType<T>
  26. type T7 = ReturnType<() => string>