https://mp.weixin.qq.com/s/6Mmy4_d11P1iPFSgX7GOBw

先问一个问题,JavaScript有几种数据类型?

number、string、boolean、null、undefined、symbol、bigint、object

其中 bigint 是 ES2020 新增的数据类型,而早在 TS3.2 时便成为 TS 的标准,其实还有好多 ES+ 标准是 TS 率先提出的,可见 TS 在很多方面是走在了 ES 前列。

TypeScript又新增了多少种数据类型?

any、unknown、enum、void、never、tuple…

其实 TypeScript 更重要的是通过 interface 和 type 赋予了用户自定义数据类型的能力,使数据在流转的过程中始终能轻易被用户掌握。

接口智能提示

  1. interface Seal {
  2. name: string;
  3. url: string;
  4. }
  5. interface API {
  6. "/user": { name: string; age: number; phone: string };
  7. "/seals": { seal: Seal[] };
  8. }
  9. const api = <URL extends keyof API>(url: URL): Promise<API[URL]> => {
  10. return fetch(url).then((res) => res.json());
  11. };

正确的使用类型收缩

使用类型断言

类型断言,滥用断言也会让我们的代码变得不可控
image.png

使用类型保护

使用 is,in,typeof,instanceof 等,使得 TypeScript 能够 get 到当前的类型
image.png

常用的高级类型

类型编程是对类型进行编程,可以利用 keyof 对属性做一些扩展,省的我们要重新定义一下接口,造成很多冗余代码

  1. type Partial<T> = {
  2. [P in keyof T]?: T[P];
  3. };
  4. type Required<T> = {
  5. [P in keyof T]-?: T[P];
  6. };
  7. type Pick<T, K extends keyof T> = {
  8. [P in K]: T[P];
  9. };
  10. type Exclude<T, U> = T extends U ? never : T;
  11. // 相当于: type A = 'a'
  12. type A = Exclude<'x' | 'a', 'x' | 'y' | 'z'>
  13. type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
  14. type Record<K extends keyof any, T> = {
  15. [P in K]: T;
  16. };
  17. interface User {
  18. id: number;
  19. age: number;
  20. name: string;
  21. };
  22. // 相当于: type PartialUser = { id?: number; age?: number; name?: string; }
  23. type PartialUser = Partial<User>
  24. // 相当于: type PickUser = { id: number; age: number; }
  25. type PickUser = Pick<User, "id" | "age">
  26. // 相当于: type OmitUser = { age: number; name: string; }
  27. type OmitUser = Omit<User, "id">
  28. type AnimalType = 'cat' | 'dog' | 'frog';
  29. interface AnimalDescription { name: string, icon: string }
  30. const AnimalMap: Record<AnimalType, AnimalDescription> = {
  31. cat: { name: '猫', icon: ' '},
  32. dog: { name: '狗', icon: ' ' },
  33. forg: { name: '蛙', icon: ' ' }, // Hey!
  34. };