字面量类型与联合类型


我们可以使用联合类型加上字面量类型,把上面的例子改写成这样:

  1. interface Res {
  2. code: 10000 | 10001 | 50000;
  3. status: "success" | "failure";
  4. data: any;
  5. }

联合类型

而联合类型你可以理解为,它代表了一组类型的可用集合,只要最终赋值的类型属于联合类型的成员之一,就可以认为符合这个联合类型。联合类型对其成员并没有任何限制,除了上面这样对同一类型字面量的联合,我们还可以将各种类型混合到一起:

  1. interface Tmp {
  2. mixed: true | string | 599 | {} | (() => {}) | (1 | 2)
  3. }

这里有几点需要注意的:

  • 对于联合类型中的函数类型,需要使用括号()包裹起来
  • 函数类型并不存在字面量类型,因此这里的 (() => {}) 就是一个合法的函数类型
  • 你可以在联合类型中进一步嵌套联合类型,但这些嵌套的联合类型最终都会被展平到第一级中

联合类型的常用场景之一是通过多个对象类型的联合,来实现手动的互斥属性,即这一属性如果有字段1,那就没有字段2:

  1. interface Tmp {
  2. user:
  3. | {
  4. vip: true;
  5. expires: string;
  6. }
  7. | {
  8. vip: false;
  9. promotion: string;
  10. };
  11. }
  12. declare var tmp: Tmp;
  13. if (tmp.user.vip) {
  14. console.log(tmp.user.expires);
  15. }

枚举

  1. enum PageUrl {
  2. Home_Page_Url = "url1",
  3. Setting_Page_Url = "url2",
  4. Share_Page_Url = "url3",
  5. }
  6. const home = PageUrl.Home_Page_Url;

这么做的好处非常明显。首先,你拥有了更好的类型提示。其次,这些常量被真正地约束在一个命名空间下(上面的对象声明总是差点意思)。如果你没有声明枚举的值,它会默认使用数字枚举,并且从 0 开始,以 1 递增: