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

TypeScript如何条件获取interface属性类型,指定key不存在时返回备选类型

你之前的写法存在两个核心问题:

  1. Responses extends 200的判断逻辑错误,该判断是验证Responses接口类型是否兼容字面量200,这个判断永远不成立
  2. 直接使用Responses['200']、Responses['204']前没有判断对应key是否存在,不存在时就会直接抛出属性不存在的类型错误。

最简实现方案

通过keyof运算符先判断目标key是否属于接口的合法键集合,再按优先级取值:

type AnyType = '200' extends keyof Responses 
  ? Responses['200'] 
  : '204' extends keyof Responses 
    ? Responses['204']
    : never;

该写法会自动按照优先级取值,两个key都不存在时返回never,不会抛出类型错误。

通用泛型工具实现

如果需要在多个接口复用该逻辑,可以封装为通用泛型:

type PriorityGet<T, PriorityKey extends PropertyKey, FallbackKey extends PropertyKey> = 
  PriorityKey extends keyof T 
    ? T[PriorityKey]
    : FallbackKey extends keyof T
      ? T[FallbackKey]
      : never;

// 调用示例
type AnyType = PriorityGet<Responses, '200', '204'>;

效果验证

  • 当Responses存在200键时,AnyType类型为{ foo: number }
  • 当Responses不存在200键、存在204键时,AnyType类型为{ bar: number }
  • 两个键都不存在时,AnyType类型为never,全程不会抛出属性不存在的错误。

内容的提问来源于stack exchange,提问作者cyrus-d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:09:03