Typescript基于interface定义类时有没有更简洁的简写方式?
解决方案
核心思路是单独维护运行时可用的允许属性列表,既解决编译期类型重复声明的问题,也能满足运行时拦截额外属性的需求,每个属性仅需要声明2次(类型定义+允许列表),大幅减少重复代码。
实现代码
// 1. 定义运行时生效的允许属性列表,配合TS类型推导复用属性名 const ALLOWED_PROPS = ['property1', 'property2', 'property3'] as const; type AllowedProp = typeof ALLOWED_PROPS[number]; // 2. 定义约束类型,额外添加不存在的属性时TS会直接编译报错 interface MyInterface { property1: string; property2: boolean; property3: number; } // 可选:额外限制入参不能出现未定义的属性,变量传参也能触发TS校验 type StrictMyInterface = MyInterface & Record<Exclude<string, AllowedProp>, never>; // 3. 类实现接口,构造函数内统一过滤赋值 class MyClass implements MyInterface { property1: string; property2: boolean; property3: number; constructor(params: StrictMyInterface) { // 仅赋值允许的属性,自动过滤额外属性 ALLOWED_PROPS.forEach(key => this[key] = params[key]); // 可选:运行时检测到额外属性直接抛错,加强校验 const extraProps = Object.keys(params).filter(key => !ALLOWED_PROPS.includes(key as AllowedProp)); if (extraProps.length) { throw new Error(`非法入参,不允许的额外属性:${extraProps.join(',')}`); } } } // 测试 // 编译期就会提示extraProperty是非法属性 const example = new MyClass({property1: "Property 1", property2: true, property3: 3, extraProperty: "Shouldn't exist"} as any); console.log(example); // 仅输出3个合法属性
优化说明
- 避免重复:属性名仅在
ALLOWED_PROPS和MyInterface中各声明一次,新增属性只需修改这两处即可 - 双重校验:编译期TS会检查入参属性合法性,运行时也会主动过滤/拦截额外属性,完全满足需求
- 可扩展性:如果后续需要添加属性校验规则,直接在构造函数的循环中添加对应逻辑即可
内容的提问来源于stack exchange,提问作者user10426087
相关产品推荐
相关产品推荐

