On this page
ConstructorParameters工具类型作用
ConstructorParameters<T>如何获取构造函数类型的参数元组?举例说明在工厂模式中动态创建类实例时的类型推导
考察点分析
本题主要考察以下核心能力维度:
- TypeScript 工具类型理解:对内置工具类型
ConstructorParameters
的实现原理及适用场景的掌握程度 - 类型推导机制:在工厂模式中如何通过类型参数约束实现类型安全
- 高级类型应用:运用条件类型(Conditional Types)与类型推断(infer)解决实际问题
具体技术评估点包括:
ConstructorParameters<T>
的泛型约束条件- infer关键字在参数类型提取中的应用
- 工厂函数中泛型参数的类型传播
- 元组类型在参数传递中的类型校验
技术解析
关键知识点
- 工具类型实现:
ConstructorParameters<T>
- 条件类型与类型推断:
T extends new (...args: infer P) => any ? P : never
- 构造函数类型约束:
new (...args: any[]) => any
- 工厂模式中的泛型应用
原理剖析
TypeScript 的ConstructorParameters<T>
通过条件类型提取构造函数参数类型:
type ConstructorParameters<T extends new (...args: any) => any> =
T extends new (...args: infer P) => any ? P : never
new (...args: any[]) => any
约束了泛型T必须是构造函数类型- 使用
infer P
捕获构造函数的参数类型P,返回参数元组类型
在工厂模式中,通过泛型绑定构造函数类型:
declare function factory<T>(Ctor: T, args: ConstructorParameters<T>): InstanceType<T>
此时TypeScript会确保传入的args参数类型与构造函数的参数类型严格匹配。
常见误区
- 尝试对非构造函数类型使用
ConstructorParameters
- 错误地使用
Parameters
替代ConstructorParameters
(前者用于普通函数) - 忽略元组类型校验(如参数个数不符或类型不匹配)
问题解答
ConstructorParameters<T>
用于提取构造函数类型的参数元组。其实现原理是通过条件类型和infer
关键字,捕获构造函数参数的类型信息。在工厂模式中,可结合泛型确保动态创建实例时的类型安全:
class Person {
constructor(public name: string, public age: number) {}
}
// 工厂函数
function createInstance<T extends new (...args: any[]) => any>(
Ctor: T,
...args: ConstructorParameters<T>
): InstanceType<T> {
return new Ctor(...args)
}
// 类型校验通过
const p = createInstance(Person, "Alice", 30) // ✅
// 类型校验失败:
createInstance(Person, 100) // ❌ 第二个参数应为number
解决方案
编码示例
// 工厂函数实现
function createInstance<T extends new (...args: any[]) => any>(
Constructor: T,
...args: ConstructorParameters<T>
): InstanceType<T> {
if (args.length < (Constructor as any).length) {
throw new Error("Missing required parameters")
}
return new Constructor(...args)
}
优化说明:
- 参数校验:通过剩余参数语法确保参数个数校验
- 时间复杂度:O(1) 仅涉及对象创建操作
- 空间复杂度:O(n) 与参数个数成正比
可扩展性建议
- 大流量场景:使用对象池复用实例
- 低端设备:采用懒加载策略延迟实例化
- 类型扩展:结合
Partial
类型实现可选参数支持
深度追问
如何实现
InstanceType
工具类型? 提示:同样使用infer
捕获实例类型如何处理构造函数重载? 提示:TypeScript无法提取重载构造函数的联合类型
如何实现带参数校验的工厂函数? 提示:结合
validate
装饰器进行运行时校验
Last updated 06 Mar 2025, 13:07 +0800 .