如何从TypeScript判别式联合类型中提取匿名成员作为返回类型?
TypeScript 提取联合类型子集作为函数返回类型
先看给定的类型与函数示例:
type testM3 = { a: 'gggg', other: 'fggfg' } type totalM = { a: '123', result: { something: '4444' }}| { a: '321' } | testM3 | null // 期望类似 totalM['a' === '123'] 的简便方式提取目标类型 function funcc2(input: totalM): ? { // 需要指定返回类型 if(input && 'result' in input){ return input } if(input && input.a === '321'){ return input } return null }
需求说明
需要让funcc2返回totalM中两类成员:包含result属性的类型、a值为'321'的类型,其余情况返回null。要求不修改totalM,也不手动编写复杂的目标类型,用类型工具自动提取。
解决方案
利用TypeScript的条件类型,分别提取目标子集后合并,作为函数返回类型:
type testM3 = { a: 'gggg', other: 'fggfg' } type totalM = { a: '123', result: { something: '4444' }}| { a: '321' } | testM3 | null // 提取包含result属性的类型 type HasResult<T> = T extends { result: unknown } ? T : never; // 提取a属性为'321'的类型 type AIs321<T> = T extends { a: '321' } ? T : never; // 合并目标类型,加上null作为最终返回类型 type Funcc2Return = HasResult<totalM> | AIs321<totalM> | null; function funcc2(input: totalM): Funcc2Return { if(input && 'result' in input){ return input; } if(input && input.a === '321'){ return input; } return null; }
原理说明
HasResult<T>:通过条件类型遍历联合类型T的每个成员,仅保留包含result属性的类型,不符合的返回never(会被联合类型自动忽略)AIs321<T>:同理,仅保留a属性值为'321'的类型- 最终
Funcc2Return就是两个目标类型加上null的联合,完全匹配函数的返回逻辑,且无需手动编写复杂的匿名类型结构
内容的提问来源于stack exchange,提问作者Kaboomy
相关产品推荐
相关产品推荐

