类型

值的分类

在语言的类型系统层面,所有的“值(Value)”被严格划分为两大类别:

graph TD
    A[Value 任意值] --> B[Primitive 原始值]
    A --> C[Object 引用类型]

    B --> B1[number / string / boolean / symbol / bigint /null / undefined]
    C --> C1[Ordinary Object 普通对象]
    C --> C2[Function Object 函数对象]
    C --> C3[Array / Date / Regexp 等异质对象]

  • 原始值(Primitives)
    • 类型本质:直接存储在栈内存中的只读不可变数据
    • 无状态性:原始值没有任何属性与方法
    • 自动装箱(Auto-boxing)
  • 对象(Objects)
    • 类型本质:存储在堆内存中的可变键值对映射表
    • TypeScript 中的类型表达
    • object(小写):表示“所有非原始值类型”。
    • Object(大写):表示包含 Object.prototype 方法的包装类型(包含可装箱的原始值)。
    • {}(空对象类型):表示除 nullundefined 外的任意值。

属性描述符

属性描述符(Property Descriptor)是 JavaScript 中用于定义和控制对象属性行为的底层元数据配置对象。

配置项属性类型默认值*作用描述
value数据undefined属性存储的具体值
writable数据false是否允许修改属性的值(true 表示可修改)
get存取器undefined读取属性时调用的 Getter 函数
set存取器undefined设置属性时调用的 Setter 函数
enumerable共享false是否可枚举(true 表示可通过 for...inObject.keys() 遍历)
configurable共享false是否可配置(true 表示允许用 delete 删除该属性,或重新修改该描述符本身)

函数对象

classDiagram
    class ObjectSpecification {
        <<Abstract>>
        +[[Prototype]]: Object | null
        +[[Extensible]]: boolean
        +Properties: Map
        +[[Get]](propertyKey, Receiver)
        +[[Set]](propertyKey, value, Receiver)
    }

    class OrdinaryObject {
        // 完全遵循默认的 [[Get]] / [[Set]] 逻辑
    }

    class FunctionObject {
        +[[Call]]: Method
        +[[Construct]]?: Method
        +prototype: Object
    }

    ObjectSpecification <|-- OrdinaryObject : 标准普通实现
    ObjectSpecification <|-- FunctionObject : 扩展可执行能力的异质实现
  • 普通对象(Ordinary Object):仅拥有属性映射与 [[Prototype]] 内部槽。用于纯粹的数据存储与组织,不具备可执行能力

  • 函数对象(Function Object):数是可执行的对象。它比普通对象多出了两个能力:

    • [[Call]] 内部槽:使其能够被 () 运算符调用执行。有 [[Call]] 的对象,typeof 才会返回 "function"
    • [[Construct]] 内部槽:使其能够配合 new 操作符作为构造函数使用,创建新的对象实例。
指针类型拥有者作用
prototype(显式原型)仅函数/类对象作为共享属性与方法的仓库,供通过 new 产生的实例继承。
[[Prototype]] / __proto__(隐式原型)所有对象(包括函数)指向创建该对象的构造函数的 prototype,形成查找链条。
  • Prototype (原型对象) 里主要包含:
    • 共享的方法 (绝大多数函数/方法都存在这里)
    • 共享的常量或静态配置
    • 指向构造函数自身的反向指针
    • 指向上一级原型对象 (Object.prototype)

TS 类型系统

  • TS 类型系统
    • 基础类型与字面量类型

      • 基础原始类型:
        • number
        • string
        • boolean
        • symbol
        • bigint
        • null
        • undefined
      • 特殊类型
        • unknown
        • void
      • 字面量类型
    • 联合类型

      • |
    • 交叉类型

      • &
    • interface / type 定义的类型

      • interface 定义的类型
      • interface 继承的类型
      • type 定义的类型
      • type通过&继承的类型
    • 函数类型

TS 泛型

  • 泛型函数
  • 泛型接口
  • 泛型类
  • 泛型约束
    • extends:类型参数必须具备指定结构

工具类型

利用泛型对类型进行转换:

  • 修饰属性
    • Partial<T>:全可选
    • Required<T>:全必填
    • Readonly<T>:全只读
  • 挑选 / 排除
    • Pick<T, K>:挑属性
    • Omit<T, K>:删属性
  • 构造映射
    • Record<K, T>:键 K → 值 T