Typescript进阶Day2

67 阅读2分钟

字面量类型与联合类型

interface Res {
  code: 10000 | 10001 | 50000;
  status: "success" | "failure";
  data: any;
}

枚举

enum PageUrl {
  Home_Page_Url = "url1",
  Setting_Page_Url = "url2",
  Share_Page_Url = "url3",
}

const home = PageUrl.Home_Page_Url;

这样做的好处:

  • 拥有了更好的类型提示。
  • 被真正的约束在一个命名空间下

注意:

// 如果没有声明枚举成员的值,默认从0开始递增。
enum Items {
  Foo, // 0
  Bar, // 1
  Baz  // 2
}

// 如果只为某一个成员指定了枚举值,那么之前未赋值的成员仍然会使用从0递增的方式,之后的成员则会开始从枚举值递增。
enum Items {
  // 0 
  Foo,
  Bar = 599,
  // 600
  Baz
}

// 在数字型枚举中,可以使用延迟求值的枚举值
//**如果你使用了延迟求值,那么没有使用延迟求值的枚举成员必须放在使用常量枚举值声明的成员之后(如上例),或者放在第一位**
const returnNum = () => 100 + 499;

enum Items {
  Foo = returnNum(),
  Bar = 599,
  Baz
}

仅有值为数字的枚举成员才能进行双向映射。

常量枚举

const enum Items {
  Foo,
  Bar,
  Baz
}

const fooValue = Items.Foo; // 0

和普通枚举的差异主要在访问性与编译产物。

  • 访问性:只能通过枚举成员访问枚举值。
  • 编译产物:对枚举成员的访问会被直接内联替换成枚举的值。

拓展阅读

类型控制流分析中的字面量类型

let i = 'xx'
// let i:string
const i = 'xx'
// const i:'xx'

使用let和const声明的变量,类型推导的不一样。是因为let声明的变量可以修改,const不可以。 但是使用const声明对象类型就不一样了,即使使用const对象类型变量仍可变,只需要推导到这个值的类型就可。