如何简写TypeScript中`K extends Foo[keyof Foo]`的类型约束?
有没有更简洁的方式替代
K extends Foo[keyof Foo]? 当然有办法避免重复书写Foo!下面是几种实用的方案,按推荐程度排序:
1. 预先定义类型别名(最推荐)
最直观且可读性最高的方式是把Foo[keyof Foo]封装成一个独立的类型别名,之后直接复用即可:
interface Foo { name: string; age: number; isActive: boolean; } // 提前提取Foo的所有属性值类型 type FooPropertyValues = Foo[keyof Foo]; // 现在只需要引用这个别名 function processValue<K extends FooPropertyValues>(value: K) { // ...函数逻辑 }
这样不仅避免了重复写Foo,还让代码意图更清晰——FooPropertyValues一看就知道是Foo接口的属性值集合。
2. 内联条件类型(无需额外别名,但可读性稍差)
如果不想单独定义类型别名,也可以用条件类型结合infer来内联实现,但写法会稍显冗长,适合临时场景:
function processValue<K extends (T extends keyof Foo ? Foo[T] : never)>(value: K) { // ...函数逻辑 }
本质上这和Foo[keyof Foo]是等价的,但依然需要写一次Foo,而且可读性不如类型别名。
注意:TypeScript暂无直接的语法糖
目前TypeScript还没有像K extends property value of Foo这种更自然的语法糖,所以上述两种方案是现阶段最实用的选择。如果你的Foo是一个对象值而非接口,还可以用typeof Foo来进一步简化:
const Foo = { name: "Alice", age: 30 } as const; // 从值自动推导类型,无需重复写Foo type FooPropertyValues = (typeof Foo)[keyof typeof Foo];
内容的提问来源于stack exchange,提问作者Lux
相关产品推荐
相关产品推荐

