类型和类

  • 类型是对所有数据的分类:null undefined number string symbol bigint boolean object
  • 类是对事物的抽象

typescript的好处

  • 编写代码边做类型检查,减少bug
  • 更智能的代码提示

函数类型声明

  1. // 方式1
  2. const add1 = (a: number, b: number):number => a + b
  3. // 方式2
  4. const add2: (a: number, b: number) => number = (a + b) => a + b
  5. // 方式3
  6. type Add = (a: number, b: number) => number
  7. const add3: Add = (a,b) => a + b
  8. // 方式4. 函数有属性,只能用interface
  9. interface AddWithProps {
  10. (a: number, b: number) => number
  11. xxx: string
  12. }
  13. const add2:AddWithProps = (a, b) => a + b
  14. add2.xxx = 'yyy'

TypeScrpt中其他类型

  1. // any 永远不知道类型
  2. let a: any = 'hi'
  3. a.name
  4. // unknown 开始不知道类型,使用时要确定类型
  5. let b: unknown = JSON.parse('{"name": "xxx"}')
  6. type C = {name: string}
  7. type E = {age: number}
  8. console.log((b as C).name) // 使用断言确定类型
  9. console.log((b as E).age) // 且可以多次修改类型
  10. // void 表示函数没有返回值
  11. let print: () => void = function() {
  12. console.log(1)
  13. }
  14. // never 表示没有类型(空集)(此时一定是出错了)
  15. type X = number & string // never
  16. type Y = (1|2|3) & (2|3|4) // 2|3
  17. // tuple 表示固定长度的数组
  18. let p: [number, string] = [100, 'x']
  19. let p2: [number, string, boolean] = [100, 'x', true]
  20. // 联合类型和类型区分
  21. type A = {
  22. name: 'a';
  23. age number
  24. }
  25. type B = {
  26. name: 'b';
  27. gender: string
  28. }
  29. const f = (n: A | B) => {
  30. if (n.name === 'a'){
  31. console.log(n.age)
  32. } else {
  33. console.log(n.gender)
  34. }
  35. }
  36. // 交叉类型: 联合类型相交取交集,对象相交则合并
  37. type A = {name: string} & {age: number}
  38. const a: A = {
  39. name: 'xxx',
  40. age: 18
  41. }

泛型

  1. // 泛型 = 广泛的类型
  2. type Add<T> = (a:T, b:T) => T
  3. // type AddNumber = Add<number>
  4. // type AddString = Add<string>
  5. const addN: Add<number> = (a, b) => a + b
  6. const addS: Add<string> = (a, b) => a + ' ' + b

函数重载

为同一个函数提供多个函数类型定义来进行函数重载

  1. function add(a: number, b: number): number;
  2. function add(a: string, b: string): string;
  3. function add(a: any, b: any): any {
  4. if (typeof a === 'number' && typeof b === 'number') {
  5. return a + b
  6. } else {
  7. return a + ' ' + b
  8. }
  9. }

用泛型封装网络请求

  1. type User = {
  2. id: string | number;
  3. name: string;
  4. age: number;
  5. }
  6. type Response<T> = {
  7. data: T
  8. }
  9. type T = Partial<Omit<User, 'id'>>
  10. type CreateResource = (path: string) => {
  11. create: (attrs: Omit<Partial<User>, 'id'>) => Promise<Response<User>>;
  12. delete: (id: User['id']) => Promise<Response<never>>;
  13. update: (id: User['id'], attrs: Omit<Partial<User>, 'id'>) => Promise<Response<User>>;
  14. get: (id: User['id']) => Promise<Response<User>>;
  15. getPage: (page: number) => Promise<Response<User[]>>
  16. }
  17. const createResource: CreateResource = (path) => {
  18. return {
  19. create(attrs){
  20. const url = path + 's'
  21. return axios.post<User>(url, {data: attrs})
  22. },
  23. delete(){},
  24. update(){},
  25. get(){},
  26. getPage(){}
  27. }
  28. }
  29. var userResource = createResource('/api/v1/user')