TypeScript如何条件获取interface属性类型,指定key不存在时返回备选类型
你之前的写法存在两个核心问题:
Responses extends 200的判断逻辑错误,该判断是验证Responses接口类型是否兼容字面量200,这个判断永远不成立- 直接使用
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
相关产品推荐
相关产品推荐

