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

如何简写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:52:06