2021-09-25 ts-内置模块的使用和实现

1. 联合类型 |, 交叉类型

let a: string | number = "123"; // 变量a的类型既可以是string,也可以是number
a = 123;

// 交叉类型
interface Student {
  classNo: string;
}

interface Person {
  name: string;
}

const a: Student&Person  = {
  classNo: "123",
  name: "fe"
}

2. keyof

interface Person {
  name: string;
  age: number;
}

type PersonKeys = keyof Person; // 等同于 type PersonKeys = 'name' | 'age'

const p1: PersonKeys = "name"; // 可以
const p2: PersonKeys = "age"; // 可以
// const p3: PersonKeys = 'height' // 不能将类型“"height"”分配给“name | age”

3. Record用于属性映射

type PersonMap = Record;
const me: PersonMap = {
  confidence: {
    name: "FE",
    age: 18,
  },
};

// Record的的实现
type MyRecord = {
  [P in K]: T
}

4. Partial (部分的; 不完全的)

type PartialPerson = Partial;
const partialPersonInstance: PartialPerson = {
  name: '12',
  // 或者只有age属性, 或者两个属性都不存在
};

// partial的内部定义
type MyPartial = {
  [K in keyof T]?: T[K]
}

5. Required(必须的) 将一个定义中的属性全部变成必选参数

type RequiredPerson= Required;
const requiredPersonInstance: RequiredPerson = {
  name: "12",
  age: 20,
};

6. ts中可以选择一个原来的接口中一部分的属性定义

type PickPerson = Pick;
const pickPersonInstance: PickPerson = {
  name: 'FE',
  // age: 20, // 不能有age属性, 会报错
};

type MyPick = {
  [P in K]: T[P];
};

7. readonly 让一个定义中的所有属性都变成只读参数

type ReadOnlyPerson = Readonly;
const readPersonInstance: ReadOnlyPerson = {
  name: '123',
  age: 20,
};

// readPersonInstance.name = '234'; // error

8. exclude 排除"联合类型" 中一部分的内容

type ExcludePerson = Exclude;

const excludePersonKeys: ExcludePerson = "age"; // 只能为age

// T extends U 就判断是否’name’ | ‘age’,  有 name, 有name就返回never,就代表将其排除
type MyExclude = T extends U ? never : T;

9. Omit 省略: 将接口或者类型的键值对删除一部分

type SomeOfPerson = Omit;

const omitPersonInstance: SomeOfPerson = {
  age: 20,
  // name: 1, // 不能有name属性 会报错
};

type MyOmit = {
  [P in Exclude]: T[P]
}

你可能感兴趣的:(2021-09-25 ts-内置模块的使用和实现)