joken-前端工程师

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

在 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 2025-01-25 20:59  joken1310  阅读(125)  评论(0)    收藏  举报