如何实现TypeScript静态方法参数类型与类fields属性的关联校验?
实现Model静态方法中参数与对应字段类型的匹配校验
问题背景
现有抽象类Model,子类通过fields属性定义字段对应的构造函数(如String/Number)。需要实现静态方法where,满足两个校验要求:
field必须是子类fields中的键value的类型必须匹配对应字段构造函数的实例类型(如name对应string,age对应number)
基础代码定义如下:
export type Fields = { [key: string]: StringConstructor | NumberConstructor }; export type Newable<T> = new () => T; export abstract class Model { abstract fields: Fields; } export class Test extends Model { override fields = { name: String, age: Number }; }
错误写法分析
之前的几种写法均无法实现预期关联校验,问题如下:
- 直接使用
typeof T['fields'][field]:- 错误引用构造函数类型而非实例类型
- 泛型
T的约束导致field是联合类型,无法与value建立一对一的类型映射
- 使用
T['fields'][keyof T['fields']]:- 得到的是构造函数的联合类型(
StringConstructor | NumberConstructor),而非实例类型,因此传入string会触发类型错误
- 得到的是构造函数的联合类型(
- 使用
T['fields'][typeof field]:typeof field本质仍是keyof T['fields']联合类型,无法实现精准的类型关联
正确解决方案
通过双重泛型绑定具体字段键,结合InstanceType提取构造函数的实例类型,实现field与value的严格类型匹配:
export type Fields = { [key: string]: StringConstructor | NumberConstructor }; export type Newable<T> = new () => T; export abstract class Model { abstract fields: Fields; static where<T extends Model, K extends keyof T['fields']>( this: Newable<T>, field: K, value: InstanceType<T['fields'][K]> ): T { // 此处可添加业务逻辑实现 return new this(); } } export class Test extends Model { override fields = { name: String, age: Number }; }
效果验证
调用时TypeScript会自动完成类型校验:
Test.where('name', 'Ryan'); // ✅ 合法,value为string匹配String构造函数的实例类型 Test.where('name', 123456); // ❌ 非法,number无法赋值给string Test.where('age', 'Ryan'); // ❌ 非法,string无法赋值给number Test.where('age', 123456); // ✅ 合法,value为number匹配Number构造函数的实例类型
关键说明
K extends keyof T['fields']:将字段键绑定为单个具体值,而非联合类型,确保field与value的一一对应关系InstanceType<T['fields'][K]>:自动提取构造函数的实例类型,将StringConstructor转为string、NumberConstructor转为number,完全匹配需求
内容的提问来源于stack exchange,提问作者Get Off My Lawn
相关产品推荐
相关产品推荐

