ts学习

103 阅读1分钟

泛型

设计泛型的关键目的是在成员之间提供有意义的约束,这些成员可以是:类的实例成员类的方法函数参数函数返回值

泛型接口

interface Identifity<T, U> {
   username: T;
   passwork: U;
}
// 想要返回两种类型的对象就可以使用泛型接口
function identity<T, U>(username: T, password: U): Identifity<T, U>  {
    return {
        username,
        password,
    }
}

泛型类

interface GenericInterface<T> {
    value: T;
    getUser: () => T;
}
class Identity<T> implements GenericInterface<T> {
  value: T;
  constructor(value: T) {
    this.value = value;
  }
  getUser(): T {
    return this.value
  }
}

泛型约束

// 检查对象上的键是否存在
interface UserInfo {
  name: string;
  age: number;
}

function getUser<T, U extends keyof T>(arg1: T, arg2:  U): T[U] {
  return arg1[arg2];
}

泛型工具类型

  • Partial 的作用就是将某个类型里的属性全部变为可选项 ?
interface UserInfo {
  name: string;
  age: number;
}

function particalFn(arg1: UserInfo, arg2: Partial<UserInfo>) {
  return { ...arg1, ...arg2 };
}

particalFn({ name: 'zs', age: 17}, { name: 'ls'});
  • Record的作用是将 K 中所有的属性的值转化为 T 类型。
type UserType = 'zs' | 'ls' | 'ww';
function recordFn(arg1: UserInfo, arg2: Record<UserType, UserInfo>) {
  return { ...arg1, ...arg2 };
}
recordFn(
  { name: 'zs', age: 17},
  {
    zs: {
      name: 'xx',
      age: 10,
    },
    ls: {
      name: 'zs',
      age: 10,
    },
    ww: {
      name: 'zs',
      age: 10,
    },
  }
);
  • Pick<T, K extends keyof T> 的作用是将某个类型中的子属性挑出来,变成包含这个类型部分属性的子类型。
function pickFn(arg1: UserInfo, arg2: Pick<UserInfo, 'name'>) {
  return { ...arg1, ...arg2 };
}

pickFn({ name: 'zs', age: 18 }, { name: 'ls'});
  • Exclude<T, U> 的作用是将某个类型中属于另一个的类型移除掉。注意!:把联合属性中的某个字符串字面量剔除出去的能力
function excludeFn(arg1: UserInfo, arg2: Exclude<'name'| 'age', 'age'>) {
  return { ...arg1 };
}
excludeFn({ name: 'zs', age: 18 }, 'name');
  • Omit
function omitFn(arg1: UserInfo, arg2: Omit<UserInfo, 'age'>) {
  return { ...arg1 };
}

excludeFn({ name: 'zs', age: 18 }, { name: 'ls'});

资料见:ts泛型