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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:55:00