1. namespace a {
  2. interface Bird {
  3. name: string;
  4. fly(): void;
  5. }
  6. interface Person {
  7. name: string;
  8. eat(): void;
  9. }
  10. //交叉类型其实就是两个接口类型属性的并集
  11. // | 或 & 且
  12. // & 表示两个类的属性都需要要
  13. type BirdMan = Bird & Person;
  14. let p: BirdMan = {
  15. name: "1",
  16. fly() { },
  17. eat() { }
  18. }
  19. }
  20. namespace b {
  21. //typeof 可以获取一个变量的类型
  22. // type Person = {
  23. // name: string,
  24. // age: number
  25. // }
  26. let p = {
  27. name: "aaa",
  28. age: 10
  29. }
  30. //使用type 定义类型 let 只能定义值
  31. type Person = typeof p;
  32. let p2: Person = {
  33. name: '',
  34. age: 1,
  35. }
  36. //我们可以通过[]来获取一个类型的子类型
  37. interface Person2 {
  38. name: string;
  39. age: number;
  40. job: {
  41. name: string
  42. }
  43. interests: { name: string; level: number }[]
  44. }
  45. let myName: Person2['job'] = {
  46. name: "ff"
  47. }
  48. let myName2: Person2['job']['name'] = 'f2'
  49. let mylevel: Person2['interests'][0]['level'] = 0;
  50. //keyof 索引类型查询操作符
  51. interface Person3 {
  52. name: string;
  53. age: number;
  54. gender: 'male' | 'female'
  55. }
  56. // type Person3Keys = 'name' | 'age' | 'gender';
  57. type Person3Keys = keyof Person3;//返回一个接口,它的key的一个集合
  58. function getValueByKey(val: Person3, key: Person3Keys): any {
  59. return val[key];
  60. }
  61. //映射类型: 在定义的时候用in操作符去批量定义
  62. interface Person4 {
  63. name: string;
  64. age: number;
  65. gender: 'male' | 'female'
  66. }
  67. //会把原来接口里的所有类型,映射出一个新的全部可选的类型
  68. type partialPerson = {
  69. [key in keyof Person4]?: Person4[key]
  70. //name?:string
  71. }
  72. //更简单的写法
  73. // type Partial<T> = {
  74. // [key in keyof T]?: T[key]
  75. // }
  76. //Partial这里是ts 内置的就想上面写的一个type
  77. type partialPerson3 = Partial<Person4>;
  78. let p4: partialPerson3 = {
  79. name: '123'
  80. }
  81. //Partial的是必填选项,
  82. //Required 表示映射的都是必填项
  83. //模拟Required ?表示可选,但是前面加一个-就表示必填
  84. // type Required<T> = {
  85. // [key in keyof T]-?: T[key]
  86. // }
  87. type partialPerson5 = Required<Person4>;
  88. let p5: partialPerson5 = {
  89. name: '123',
  90. age: 123,
  91. gender: 'female'
  92. }
  93. //只读 Readonly ,就不可以修改了
  94. //模拟readeronly
  95. // type Readonly<T> = {
  96. // readonly [key in keyof T]: T[key]
  97. // }
  98. type partialPerson6 = Readonly<Person4>;
  99. let p6: partialPerson6 = {
  100. name: '123',
  101. age: 123,
  102. gender: 'female'
  103. }
  104. //pick 过滤提取一个参数
  105. //模拟实现Pick
  106. // type Pick<T, K extends keyof T> = {
  107. // [key in K]: T[key]
  108. // }
  109. type PickPerson = Pick<Person4, 'name'>;
  110. let x: PickPerson = { name: "142" }
  111. }

ts 要区分 类型和值

类型 interface class enum
值 let var function
class enum 既可以作为类型又可以作为值

interface可以赋值么

instanceof 接口 = 接口么 ?不可以
因为是类型不能进行赋值操作 ,也不可以当成值来用

type 可以赋值么

type 类型 = 类型 是可以的
let a1 = typeof x; //一个返回数据类型,赋值给a
type a2 = typeof x; //一个是取出x原有的类型

什么时候用interface , 什么时候用type,还有class ,三者一般在什么时候使用

//interface 是定义接口类型,它是一个真实的类型,也可能会被导出和导入
//type只是临时用的别名,并不会产出一个真正的类型
//class就是定义类的 ,可以来new

条件类型

  1. //条件类型
  2. interface Fish {
  3. name1: string
  4. }
  5. interface Fish2 {
  6. name1: string
  7. age: number
  8. }
  9. interface Water {
  10. name2: string
  11. }
  12. interface Bird {
  13. name3: string
  14. }
  15. interface Sky {
  16. name4: string
  17. }
  18. //判断传入的泛型T 是不是继承与接口
  19. //但是这里实际比较的不是 名称或者是不是完全一致,而是之前说的比较类型
  20. //看传入的类型 是不是完全满足 了原来的类型
  21. type Condition<T> = T extends Fish ? Water : Sky;
  22. let condition: Condition<Fish2> = {
  23. name2: 's',
  24. }
  25. //条件类型的分发
  26. type Condition2<T> = T extends Fish ? Water : Sky;
  27. let condition1: Condition<Fish | Bird> = {
  28. name2: "22"
  29. }
  30. let condition2: Condition<Fish | Bird> = {
  31. name4: "3"
  32. }