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
相关产品推荐
相关产品推荐

