ConstructorParameters

ConstructorParameters 是 TypeScript 中的一个工具类型(utility type),它用于获取构造函数参数的类型。这个工具类型可以用来提取类构造函数的所有参数类型的元组。

用法

ConstructorParameters 的基本语法如下:

复制代码
type ConstructorParameters<T> = T extends new (...args: infer P) => any ? P : never;
  • T 是一个构造函数类型。
  • infer P 用于推断构造函数的参数类型,并将它们存储在 P 中。
  • 如果 T 不是一个构造函数,那么结果将是 never。

示例

假设你有一个类 Person,它的构造函数接受两个参数:name 和 age。

复制代码
class Person {
  constructor(public name: string, public age: number) {}
}

你可以使用 ConstructorParameters 来提取 Person 类构造函数的参数类型:

复制代码
type PersonParams = ConstructorParameters<typeof Person>;

// PersonParams 的类型是 [string, number]

具体应用场景

1. 创建工厂函数

假设你想创建一个工厂函数来生成 Person 实例,但你希望确保工厂函数的参数与 Person 构造函数的参数一致。

复制代码
function createPerson(...args: ConstructorParameters<typeof Person>) {
  return new Person(...args);
}

const person = createPerson("Alice", 30); // 正确
// const person2 = createPerson("Bob"); // 编译错误,缺少参数
2. 泛型工厂函数

如果你有多个类,并且希望为这些类创建通用的工厂函数,你可以使用泛型和 ConstructorParameters。

复制代码
class Employee {
  constructor(public name: string, public department: string) {}
}

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

const employee = createInstance(Employee, "John Doe", "HR");
const person = createInstance(Person, "Jane Doe", 25);

console.log(employee); // Employee { name: 'John Doe', department: 'HR' }
console.log(person);   // Person { name: 'Jane Doe', age: 25 }

在这个例子中,createInstance 函数接受一个构造函数 ctor 和任意数量的参数 args。args 的类型由 ConstructorParameters<typeof ctor> 确定,这样可以确保传入的参数与构造函数的参数类型匹配。

3. 参数类型检查

你还可以使用 ConstructorParameters 来进行参数类型检查,确保传递给某个函数或方法的参数与预期的构造函数参数类型一致。

复制代码
function checkPersonParams(...params: ConstructorParameters<typeof Person>) {
  if (typeof params[0] !== 'string') {
    throw new Error('First parameter must be a string');
  }
  if (typeof params[1] !== 'number') {
    throw new Error('Second parameter must be a number');
  }
}

try {
  checkPersonParams("Alice", 30); // 通过
  checkPersonParams(42, "Alice"); // 抛出错误
} catch (error) {
  console.error(error.message);
}

总结

ConstructorParameters 是一个非常有用的工具类型,可以帮助你在 TypeScript 中提取和使用构造函数的参数类型。这使得代码更加类型安全,减少了手动维护类型定义的工作量。通过结合泛型和其他 TypeScript 特性,你可以编写出更加灵活和健壮的代码。

相关推荐
treasure1409 小时前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
jay神10 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
屏什么录10 小时前
长时间录屏中途崩溃:MP4 打不开的 6 种救回方案与参数设置
前端·音视频开发
code_Bo10 小时前
不只命令行:我把跨 Agent 会话同步做成了桌面应用
前端·javascript·后端
kyriewen10 小时前
AI 能把页面写出来,为什么改个需求就开始崩?
前端·javascript·人工智能
涛涛ing12 小时前
2026年最值得关注的前端变化,藏在“默认值”里
前端
亿元程序员13 小时前
太牛了!这AI做出来的游戏,居然还能变现!
前端
hellice14 小时前
闪传 FlashDrop 实战:我用 300 行 Node 代码做了个「4 位取件码」临时文件中转站
前端·产品
用户08297732600514 小时前
RTX 5500 MIG 踩坑记录:切分之后模型跑不起来,排错整整一下午
前端
Lank_M14 小时前
AI 放大后的图更清楚,但它不能当原图入库
前端