函数重载

  1. function greet(name: string):string;
  2. function greet(name: string[]): string;
  3. function greet(name:unknown):string {
  4. if(typeof name === 'string'){
  5. return `hello ${name}`
  6. } else if (Array.isArray(name)){
  7. return `hello ${name.join(',')}`
  8. }
  9. return 'unkown'
  10. }
  11. const a = greet('Tom')
  12. const b= greet(['Tom', 'Marry'])
  13. console.log(a)
  14. console.log(b)

索引类型和Record类型

它们两个很多情况下都是一样的,就是索引类型中的key的类型比较少,只能是number、string、symbol

索引类型

索引类型的key只能是number、string、symbol、或者是字面量类型

  1. type AType = {
  2. [prop: number|string|symbol|`$${string}Change`]:any
  3. }
  4. const a:AType ={
  5. name: 'Tom',
  6. 10: 'age'
  7. }

不能使用其他的,例如字面量联合类型

  1. type Level ='error'|'warn'|'info'
  2. type BType = {
  3. [prop:Level]: any
  4. }
  5. //error 索引签名参数类型不能为文本类型或泛型类型。请考虑改用映射的对象类型。ts(1337)

Record类型

Record类型的中的key的类型是string|number|symbol|T

  1. type PersonKey = 'name'|'age'|'sex'
  2. type Person =Record<PersonKey,any>

keyof

  1. type User = {
  2. name: string;
  3. age: number;
  4. sex: boolean
  5. }
  6. type U1 = User["name"]
  7. // string
  8. type U2 = User["name"|"age"]
  9. // string|number
  10. type U3 = User[keyof User]
  11. // string | number | boolean
  12. function getProperty<T extends object, K extends keyof object>(obj, key) {
  13. return obj[key]
  14. }

映射类型

  1. type User = {
  2. name: string;
  3. age: number;
  4. sex: boolean
  5. }
  6. type MyPartial<T> = {
  7. [P in keyof T]?:T[P]
  8. }
  9. type UserPartial = MyPartial<User>;
  10. //等同于
  11. type UserPartial = {
  12. name?: string;
  13. age?: number;
  14. sex?: boolean;
  15. }

key remapping

  1. type MappedTypeWithNewKeys<T> = {
  2. [K in keyof T as NewKeyType]: T[K]
  3. }
  1. type User = {
  2. name: string;
  3. age: number;
  4. sex: boolean
  5. }
  6. type Getters<T> = {
  7. [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
  8. }
  9. type UserGetters = Getters<User>;
  10. //等同于下面
  11. type UserGetters = {
  12. getName: () => string;
  13. getAge: () => number;
  14. getSex: () => boolean;
  15. }
  16. //方便的移除类型中的某些Key
  17. type RemoveSexField<T> = {
  18. [K in keyof T as Exclude<K, 'sex'>]: T[K]
  19. }
  20. type UserRemoveSexField = RemoveSexField<User>;
  21. //等同于下面
  22. type UserRemoveSexField = {
  23. name: string;
  24. age: number;
  25. }
  26. //等同于下面
  27. type C = Omit<User, 'sex'>