TypeScript 高级类型
00 分钟
2024-7-5
2024-7-5
type
status
date
slug
summary
tags
category
icon
password

enum 枚举

枚举允许开发人员定义一组命名常量。使用枚举可以更轻松地记录意图,或创建一组不同的案例。TypeScript 提供基于数字和基于字符串的枚举。
TypeScript 中可以通过 enum 关键字来定义枚举。

数字枚举

因为在定义 ReqMethod 枚举时,没有使用初始化器,因此 Get 的值为 0,Post 的值为 1,依次递增。也可以根据实际需求调整值:
手动赋值的枚举项可以不是数字,但是必须是在枚举最后,或者是初始化器之前。

字符串枚举

异构枚举

数字字符串混用 属于异构枚举 虽然可以使用,但不建议这么做。

反向映射

枚举除了创建具有属性名称的对象外,数字枚举还会创建从枚举值到枚举名称的反向映射

常数项和计算所得项

枚举项有两种类型:常数项计算所得项(上面的例子都属于常数项)。
在官方定义中,只要满足以下任意一条就是常数项:
  • 枚举是不具有表达式的数值枚举或字符串枚举,则每一项都是常数项(字符串枚举不允许包含计算所得项成员
    • 枚举成员使用常量表达式初始化,并且这个表达式在ts的编译阶段能够被求值
      • 引用之前定义的常数枚举成员
      • +, , ~ 一元运算符应用于常数枚举表达式
      • +, , , /, %, <<, >>, >>>, &, |, ^ 二元运算符应用于常数枚举表达式
    除以上的其他所有情况的枚举成员都被当做计算所得项。

    常量枚举

    常数枚举是使用 const enum 定义的枚举类型。
    常量枚举与普通枚举的区别是,它会在编译阶段被删除,且不能包含计算所得项。

    联合类型

    联合类型是由两种或多种其他类型组成的类型,表示可能是这些类型中的任何一种的值。
    联合类型使用 | 分隔每个类型。
    当联合类型不能确定其到底是什么类型时,只能访问联合类型所共有的东西。

    限制

    • 当联合类型中出现 TypeScript的两个顶级类型时,会被合并为顶级类型
      • 当联合类型中出现底部类型 never 类型时,会被过滤掉

        交叉类型

        交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。表示方法是:A & B
        TS 的交叉类型并不是指每个类型的交集,& 的意思理解成 andA & B 表示同时包含 AB 的结果,这里传进去的 user 必须同时拥有 name, age 这两个属性。

        Interfaces 接口

        在 TypeScript 中我们描述一个对象的形状。
        • 可以匿名描述:
          • 或者是通过接口描述:

            定义

            1. 是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement)
            1. TypeScript 中,我们使用接口Interfaces来定义对象的类型。除了可用于对类的一部分行为进行抽象以外,也常用于对「对象的形状(Shape)」进行描述。

            接口的使用

            Interfaces 除了可以描述对象的形状外,还可以描述 函数、可索引类型、类。
            变量的形状必须和接口的形状保持一致

            可选属性

            有时候需要我们不完全去匹配一个形状,可以使用可选属性(该属性可以不存在)。

            任意属性

            有时候我们希望接口,除了定义的属性外,可以有其他的属性。

            只读属性

            使用 readonly关键字。

            接口合并

            同名的接口会发生合并。
            接口的非函数的成员应该是唯一的。如果它们不是唯一的,那么它们必须是相同的类型。如果两个接口中同时声明了同名的非函数成员且它们的类型不同,则编译器会报错。
            对于函数成员,每个同名函数声明都会被当成这个函数的一个重载。合并后,后面的接口优先级更高。

            接口继承

            有时我们需要对已有的接口进行扩展,可以使用继承。使用extends关键字从其他interface复制成员,并添加我们想要的任何新成员。

            type 类型别名

            给一个类型起个新名字,和接口很像,但是类型别名可以为任何类型命名,而不仅仅是对象类型。

            Interfaces 与 type 的区别

            类型别名和接口非常相似,在很多情况下可以自由选择。几乎所有的interface特性都可以在type中使用。

            区别:

            • 类型扩展
            • 类型别名可能不参与声明合并,但接口可以
            • 接口只能用于声明对象的形状,不能声明原始类型
            上一篇
            TypeScript 工具类型
            下一篇
            TypeScript 基本类型