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

TypeScript如何基于单一属性列表实现请求与返回值类型复用

TypeScript单数据源属性定义方案

核心逻辑是通过as const常量断言锁定属性列表的字面量类型,以常量数组作为唯一维护点,同时覆盖API参数校验、返回值类型推导两个场景,彻底消除重复代码。

具体实现

  • 定义唯一属性常量列表
    把需要拉取的属性统一定义为只读常量,通过satisfies约束数组元素必须是DealProperties的合法键,写错属性名时TS会直接抛出类型错误:

    // *唯一需要维护的属性列表,新增/修改/删除属性只改这里*
    const REQUEST_DEAL_PROPERTIES = [
      'dealname',
      'loan_type',
      'asset_type',
      'a_c_square_footage',
      'borrowing_entity_type',
      'borrowing_entity',
      'date_of_formation',
      'estimated_value',
      'exit_strategy',
      'fixed_or_arm',
      'intended_use',
      'lender',
      'loan_channel',
      'loan_program',
      'ltv',
      'project_name',
      'property_address',
      'property_type',
      'requested_terms',
      'subject_property_address',
      'subject_property_city',
      'subject_property_state',
      'subject_property_zip_code',
      'year_built',
      'amount',
      'hubspot_owner_id',
      'outstanding_mortgage_balance',
    ] as const satisfies readonly (keyof DealProperties)[]
    
  • 自动推导返回值类型
    直接通过typeof提取常量数组的成员类型,不需要手动枚举属性生成联合类型,再配合Pick生成返回值的类型标注:

    // 从常量自动推导属性联合类型
    type DealPropsKeys = typeof REQUEST_DEAL_PROPERTIES[number]
    // 等价于之前手写的Pick类型,属性和请求参数100%对齐
    type DealProps = Pick<DealProperties, DealPropsKeys>
    
  • API调用直接传入常量
    调用HubSpot接口时直接传入定义好的常量即可,如果SDK参数不支持只读数组,展开为普通数组传入即可,类型校验依然生效:

    const deal = await hubSpotClient.crm.deals.basicApi.getById(
      dealId,
      // 兼容SDK的可变数组参数要求,类型安全
      [...REQUEST_DEAL_PROPERTIES] as (keyof DealProperties)[]
    )
    // deal返回值直接标注为DealProps即可,属性完全匹配
    

兼容低版本TS场景

如果项目使用的TS版本低于4.9(不支持satisfies关键字),可以通过编译时类型检查替代,依然能保证属性合法性:

const REQUEST_DEAL_PROPERTIES = [
  // 同上属性列表
] as const
// 编译时校验:存在非法属性时这行代码会报类型错误
type _PropertyCheck = typeof REQUEST_DEAL_PROPERTIES[number] extends keyof DealProperties ? true : false
const _validCheck: _PropertyCheck = true

// 后续类型推导、API调用逻辑和上述写法完全一致

注意:必须加as const断言,否则TS会把数组类型推导为string[],无法提取精确的字面量属性名,会导致类型推导失效。


内容的提问来源于stack exchange,提问作者dazuaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:51:22