
本文深入探讨如何在typescript中为泛型函数约束对象键的类型,使其仅接受特定值类型的键,并同时保留ide的智能提示功能。通过介绍条件类型、映射类型和泛型约束,文章展示了如何构建强大的类型工具,确保代码的类型安全和开发效率。
在TypeScript开发中,我们经常需要编写能够处理各种类型对象的泛型函数。一个常见的需求是,从一个泛型对象 T 中提取某个属性 K 的值,并确保这个属性的值是特定类型(例如 string)。然而,直接实现这样的功能会遇到类型安全问题,并且会丢失IDE的智能提示。
考虑以下尝试:
function extractStringValue<T extends object, K extends keyof T>(obj: T, key: K): string {
// 错误: Type 'T[K]' is not assignable to type 'string'.
// Type 'T[K]' could be instantiated with an arbitrary type which is not a subtype of 'string'.
return obj[key];
}
// 期望的使用方式
const myObj = { stringKey: "hi", boolKey: false, numKey: 123 };
const stringVal = extractStringValue(myObj, "stringKey"); // 期望通过
const stringVal2 = extractStringValue(myObj, "boolKey"); // 期望报错
const stringVal3 = extractStringValue(myObj, "numKey"); // 期望报错上述代码中,extractStringValue 函数的目的是返回一个 string 类型的值。然而,K extends keyof T 意味着 K 可以是 T 中任何键的字面量类型,而 T[K] 可能是 string、boolean、number 或其他类型。TypeScript编译器无法保证 T[K] 总是 string 类型,因此会抛出类型错误。此外,在调用 extractStringValue 时,传入 key 参数时,IDE会提示 myObj 的所有键("stringKey"、"boolKey"、"numKey"),而我们希望它只提示那些值为 string 的键。
为了解决上述问题,我们需要一种机制来:
我们可以通过定义一个高级的实用类型 StringKeys
StringKeys
type StringKeys<T> = Exclude<{
[P in keyof T]: T[P] extends string ? P : never
}[keyof T], undefined>;让我们逐步解析这个类型:
通过这个 StringKeys
语流软著宝
AI智能软件著作权申请材料自动生成平台
228
查看详情
现在,我们可以使用 StringKeys
function extractStringValue<T extends Record<K, string>, K extends StringKeys<T>>(
obj: T,
key: K,
): string {
return obj[key];
}
// 示例用法
const myObj = { stringKey: "hi", boolKey: false, numKey: 123 };
const stringVal1 = extractStringValue(myObj, "stringKey"); // OK
console.log(stringVal1); // 输出 "hi"
// 错误: Argument of type '"boolKey"' is not assignable to parameter of type '"stringKey"'.
// const stringVal2 = extractStringValue(myObj, "boolKey");
// 错误: Argument of type '"numKey"' is not assignable to parameter of type '"stringKey"'.
// const stringVal3 = extractStringValue(myObj, "numKey");
// IDE智能提示现在只会显示 "stringKey"
// extractStringValue(myObj, ""); // 尝试输入时,IDE只会提示 "stringKey"这里有两个关键的泛型约束:
通过这两个约束的协同作用,我们不仅解决了编译器的类型错误,而且在调用函数时,IDE会根据 myObj 的实际结构,只提供 stringKey 作为 key 参数的有效选项,极大地提升了开发体验。
上述 StringKeys
type KeysOfType<T, O> = Exclude<{
[P in keyof T]: T[P] extends O ? P : never
}[keyof T], undefined>;
// 基于 KeysOfType 定义特定类型的键
type StringKeys<T> = KeysOfType<T, string>;
type BooleanKeys<T> = KeysOfType<T, boolean>;
type NumberKeys<T> = KeysOfType<T, number>;
// 示例:提取布尔值键的函数
function extractBooleanValue<T extends Record<K, boolean>, K extends BooleanKeys<T>>(
obj: T,
key: K,
): boolean {
return obj[key];
}
const anotherObj = {
name: "Alice",
isActive: true,
age: 30,
isAdmin: false
};
const activeStatus = extractBooleanValue(anotherObj, "isActive"); // OK
console.log(activeStatus); // 输出 true
// 错误: Argument of type '"name"' is not assignable to parameter of type '"isActive" | "isAdmin"'.
// const nameValue = extractBooleanValue(anotherObj, "name");
// IDE智能提示现在只会显示 "isActive" 和 "isAdmin"
// extractBooleanValue(anotherObj, ""); // 尝试输入时,IDE只会提示 "isActive" | "isAdmin"KeysOfType
通过掌握这些高级的TypeScript类型技巧,开发者可以编写出更健壮、更智能的泛型代码,充分发挥TypeScript的类型系统优势。
以上就是TypeScript中约束泛型对象键值类型并实现智能提示的详细内容,更多请关注其它相关文章!
# 返回值
# 拼多多关键词排名技巧
# 理发店怎样直播营销推广
# 烟台seo优化模式
# 如何做网站淘宝推广员
# 山东使用seo优化排行
# 网站微信微博抖音推广
# 晋州网站推广策划公司
# 网站建设学什么语音
# 大亚湾营销推广费用
# 百度竞价 网站推广
# typescript
# 服务端
# 不与
# 首个
# 报错
# 键值
# 这是一个
# 我们可以
# 值为
# 只会
# 工具
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
qq邮箱怎么注册_QQ邮箱注册步骤与注意事项
视频号视频怎么提取文案?提取的文案如何优化与使用?
CDR如何复制交互式填充色
微信客户端怎么查看二维码_微信客户端个人二维码查看方法
使用jQuery精确检测除指定元素外任意位置的点击事件
《全民k歌》网页版最新登录入口一览
宝妈做视频号该写什么标签话题?宝妈关注的话题有哪些?
酷狗音乐多音轨设置教程
12306不能订票的时间段是固定的吗? | 节假日购票时间有无变化
如何解决Casbin日志与应用日志不统一的问题,使用casbin/psr3-bridge实现无缝集成
广州地铁app准妈咪徽章领取方法
海棠阅读网页版_进入海棠网页版在线阅读中心
口腔诊所管理软件推荐
Word 2003字体大小设置方法
《桃源记2》资源采集攻略
Python高效统计字典嵌套列表值在目标列表中的出现次数
汽水音乐车机版官网5.0 汽水音乐车机版5.0版本下载入口
聚水潭ERP后台管理系统登录 聚水潭ERP官方登录通道
《浙里办》电子发票开具方法
极兔快递官网查询入口手机版 手机极兔快递登录查询入口官方
mysql怎么查询数据_mysql基础查询语句使用教程
纯CSS实现自适应宽度与响应式布局的水平按钮组
智学网app怎么登录忘记密码_智学网app忘记密码找回与重新登录操作方法
优酷官网登录入口电脑版 优酷官网网址入口
Flexbox布局:实现粘性导航与底部页脚的完美结合
《糖豆》添加舞曲方法
5G和6G的连接密度有什么区别 6G每平方公里能连接多少设备
如何在CSS中设置背景图像:一个全面指南
苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤
iPhone 13 Pro Max如何设置桌面小组件_iPhone 13 Pro Max小组件添加指南
美发店速赢秘籍
蜻蜓FM如何设置移动流量播放
《新三国志曹操传》游历事件袁尚突围攻略
TikTok搜索结果不显示怎么办 TikTok搜索刷新与优化方法
《tt语音》超级玩家开通方法
三角洲行动2025年9月10日摩斯密码分享
漫蛙漫画官方网站使用_漫蛙manwa网页版在线入口教程
抖音小程序怎么开通?小程序开通条件是什么?
PHP多语言网站的实现:会话管理与翻译函数优化教程
C++ switch case字符串_C++如何实现字符串switch匹配
如何定制PrimeNG Sidebar的背景颜色
小红书网页版首页入口 小红书网页版电脑端官方登录链接
poki官网最新入口 poki小游戏大全入口
使用 J*aScript 随机化 CSS Grid 布局中的元素顺序
qq音乐官方网站入口_qq音乐在线听歌网页版链接
优化CSS动画与J*aScript定时器协同:构建稳定Toast提示
win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】
J*aScript对象中深度嵌套URL键的查找与更新策略
c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化
智学网成绩单查询系统网_智学网学生平台登录
2025-11-01
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。