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

TypeScript中带& string与不带& string的keyof工具类型差异对比

带& string与不带的Keys<T>工具类型差异

1. 类型范围的核心区别

  • 不带& string的Keys<T>:直接返回keyof T的完整结果,包含目标类型所有合法键类型——字符串、数字、Symbol类型的键都会被包含(如果目标类型有这些键的话)。
  • 带& string的Keys<T>:通过交叉类型keyof T & string,把keyof T的结果过滤为仅字符串类型的键,自动排除数字和Symbol类型的键。

2. 实际场景的差异表现

当目标类型包含非字符串键时,差异会直接显现:

const uniqueId = Symbol('uniqueId');
type MixedKeyItem = {
  name: string;
  [2024]: number;
  [uniqueId]: boolean;
}

// 不带& string的情况
type KeysWithoutString = keyof MixedKeyItem;
// 类型结果:"name" | 2024 | typeof uniqueId

// 带& string的情况
type KeysWithString = keyof MixedKeyItem & string;
// 类型结果:"name"

3. 对纯字符串键类型的影响

像你提供的Product这种所有键都是字符串的类型,两种写法的最终结果完全一致:

type KeysOfProduct = Keys<Product>;
// 两种写法都得到:"name" | "price"

但加上& string相当于加了一层类型安全约束,确保后续使用Keys<T>时,拿到的键一定是字符串类型,避免因目标类型后续新增非字符串键而引发类型异常。

内容的提问来源于stack exchange,提问作者Brian Tzu-Pin Ho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:55:40