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
相关产品推荐
相关产品推荐

