joken-前端工程师

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::
  404 随笔 :: 39 文章 :: 8 评论 :: 20万 阅读

在 TypeScript 中,构造函数类型和实例类型分别描述了不同的结构,以下是它们的核心区别:

1. 构造函数类型

  • 定义:构造函数类型描述构造函数本身的结构,包括静态成员和构造签名。
  • 语法:使用 new (...args) => InstanceType 表示,或通过 typeof ClassName 获取。
  • 包含内容
    • 静态属性和方法(如 static species)。
    • 构造签名(通过 new 调用时接收的参数和返回的实例类型)。
  • 示例
    interface PersonConstructor {
      new (name: string): Person; // 构造签名
      species: string; // 静态属性
    }
    
    class Person {
      static species = "Human";
      constructor(public name: string) {}
    }
    
    // typeof Person 包含静态成员和构造签名
    const Ctor: typeof Person = Person;
    

2. 实例类型

  • 定义:实例类型描述构造函数创建出的对象的结构,即实例的属性和方法。
  • 语法:直接使用类名 ClassName 或通过 InstanceType<ConstructorType> 工具类型获取。
  • 包含内容
    • 实例属性和方法(如 namegreet())。
    • 不包含静态成员。
  • 示例
    class Person {
      name: string;
      constructor(name: string) {
        this.name = name;
      }
      greet() {
        console.log(`Hello, ${this.name}`);
      }
    }
    
    // Person 类型表示实例
    const person: Person = new Person("Alice");
    person.greet(); // 正确
    person.species; // 错误,静态属性不属于实例
    

3. 关键对比

特性 构造函数类型 实例类型
表示方式 typeof ClassName 或构造签名 ClassName
包含内容 静态成员、构造签名 实例属性/方法
典型用途 传递类本身(如工厂函数参数) 操作实例对象

4. 实用场景

  • 构造函数类型:用于需要动态创建实例的场景。
    function createInstance<T>(
      Ctor: new (name: string) => T,
      name: string
    ): T {
      return new Ctor(name);
    }
    createInstance(Person, "Bob"); // 正确
    
  • 实例类型:用于确保对象结构符合预期。
    function greet(person: Person) {
      person.greet(); // 确保实例有 greet 方法
    }
    

5. 工具类型

  • InstanceType<T>:从构造函数类型提取实例类型。
    type PersonInstance = InstanceType<typeof Person>; // 等价于 Person 类型
    

总结

  • 构造函数类型 = 如何构造对象(参数、静态成员)。
  • 实例类型 = 对象被构造后的形态(属性、方法)。
    理解二者的区别,能帮助你更精准地定义类型,避免混淆静态与实例成员的使用场景。
posted on   joken1310  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示