阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 构造器函数类型

构造器函数类型

作者:陈川 阅读数:54776人阅读 分类: TypeScript

构造器函数类型的基本概念

TypeScript中的构造器函数类型用于描述类的构造函数。它定义了创建类实例时所需的参数类型和返回类型。构造器函数类型通常与new关键字一起使用,表示这是一个构造函数而非普通函数。

interface ClockConstructor {
  new (hour: number, minute: number): ClockInterface;
}

interface ClockInterface {
  tick(): void;
}

function createClock(
  ctor: ClockConstructor,
  hour: number,
  minute: number
): ClockInterface {
  return new ctor(hour, minute);
}

构造器函数类型的语法

构造器函数类型的语法与普通函数类型类似,但在参数列表前需要添加new关键字。基本形式如下:

type Constructor = new (...args: any[]) => any;

更具体的构造器类型可以这样定义:

type PointConstructor = new (x: number, y: number) => Point;

构造器函数类型的应用场景

工厂函数

构造器函数类型常用于创建工厂函数,这些函数接收构造函数作为参数并返回新实例:

class Car {
  constructor(public model: string) {}
}

type CarConstructor = new (model: string) => Car;

function createCar(ctor: CarConstructor, model: string): Car {
  return new ctor(model);
}

const myCar = createCar(Car, "Tesla");

类装饰器

在实现类装饰器时,构造器函数类型是必不可少的:

function logged<T extends new (...args: any[]) => any>(ctor: T) {
  return class extends ctor {
    constructor(...args: any[]) {
      console.log(`Creating instance with args: ${args}`);
      super(...args);
    }
  };
}

@logged
class Person {
  constructor(public name: string) {}
}

构造签名与实例类型

构造器函数类型可以分解为构造签名和实例类型两部分:

interface AnimalConstructor {
  // 构造签名
  new (name: string): Animal;
  
  // 静态方法
  createDefault(): Animal;
}

interface Animal {
  name: string;
  makeSound(): void;
}

class Dog implements Animal {
  constructor(public name: string) {}
  
  makeSound() {
    console.log("Woof!");
  }
  
  static createDefault() {
    return new Dog("Default");
  }
}

泛型构造器函数类型

构造器函数类型也可以使用泛型,增加灵活性:

type GenericConstructor<T> = new (...args: any[]) => T;

function createInstance<T>(ctor: GenericConstructor<T>, ...args: any[]): T {
  return new ctor(...args);
}

class Book {
  constructor(public title: string) {}
}

const myBook = createInstance(Book, "TypeScript Deep Dive");

构造器函数类型与继承

当处理类继承时,构造器函数类型可以确保子类满足特定的构造要求:

class Animal {
  constructor(public name: string) {}
}

type AnimalConstructor = new (name: string) => Animal;

class Dog extends Animal {
  constructor(name: string, public breed: string) {
    super(name);
  }
}

function createAnimal(ctor: AnimalConstructor, name: string): Animal {
  return new ctor(name);
}

// 可以传入Dog,因为它满足AnimalConstructor类型
const myDog = createAnimal(Dog, "Buddy");

构造器函数类型与混合模式

在实现混合模式时,构造器函数类型特别有用:

type Constructor<T = {}> = new (...args: any[]) => T;

function Timestamped<TBase extends Constructor>(Base: TBase) {
  return class extends Base {
    timestamp = Date.now();
  };
}

class User {
  constructor(public name: string) {}
}

const TimestampedUser = Timestamped(User);
const user = new TimestampedUser("Alice");
console.log(user.timestamp);

构造器函数类型的高级模式

参数解构

构造器函数类型可以结合参数解构使用:

type Point3DConstructor = new (options: { x: number; y: number; z: number }) => Point3D;

class Point3D {
  constructor(public x: number, public y: number, public z: number) {}
}

function createPoint3D(ctor: Point3DConstructor, options: { x: number; y: number; z: number }) {
  return new ctor(options);
}

可选参数

构造器函数类型也可以包含可选参数:

type PersonConstructor = new (name: string, age?: number) => Person;

class Person {
  constructor(public name: string, public age?: number) {}
}

构造器函数类型与接口合并

接口可以包含构造签名,这使得它们可以描述构造函数:

interface StringArray {
  [index: number]: string;
}

interface StringArrayConstructor {
  new (size: number): StringArray;
  from(array: any[]): StringArray;
}

declare const StringArray: StringArrayConstructor;

const myArray = new StringArray(10);
const otherArray = StringArray.from([1, 2, 3]);

构造器函数类型与类型推断

TypeScript能够从构造器函数类型中推断出实例类型:

function getInstance<T>(ctor: new () => T): T {
  return new ctor();
}

class Widget {
  id = Math.random();
}

const widget = getInstance(Widget);  // widget类型被推断为Widget

构造器函数类型与抽象类

抽象类的构造器函数类型需要特殊处理:

abstract class Animal {
  abstract makeSound(): void;
}

type AnimalConstructor = new () => Animal;

// 错误:不能直接实例化抽象类
// const animal = new Animal();

// 但可以作为类型约束
function createAnimalSubclass(ctor: AnimalConstructor): Animal {
  class Temp extends ctor {}
  return new Temp();
}

构造器函数类型与私有构造函数

处理单例模式时,私有构造函数的类型表示:

class Singleton {
  private static instance: Singleton;
  
  private constructor() {}
  
  static getInstance(): Singleton {
    if (!Singleton.instance) {
      Singleton.instance = new Singleton();
    }
    return Singleton.instance;
  }
}

// 构造器类型可以这样表示
type SingletonConstructor = typeof Singleton;

构造器函数类型与重载

构造器函数类型也可以表示重载的构造函数:

interface PointConstructor {
  new (x: number, y: number): Point;
  new (coord: [number, number]): Point;
}

class Point {
  constructor(...args: [number, number] | [number, number]) {
    // 实现重载逻辑
  }
}

构造器函数类型与条件类型

结合条件类型可以创建更灵活的构造器类型:

type ConstructorArg<T> = T extends new (arg: infer A) => any ? A : never;

class Foo {
  constructor(public value: string) {}
}

type FooArg = ConstructorArg<typeof Foo>;  // string

构造器函数类型与映射类型

映射类型可以用于转换构造器函数类型:

type WithName<T> = T & { name: string };

type NamedConstructor<T> = new (...args: any[]) => WithName<T>;

class Person {
  constructor(public name: string, public age: number) {}
}

type NamedPersonConstructor = NamedConstructor<Person>;

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌