You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 09:54:08