TS泛型坑,编译懵!

📅 2026/6/29 18:11:52
TS泛型坑,编译懵!
博客主页瑕疵的CSDN主页 Gitee主页瑕疵的gitee主页⏩ 文章专栏《热点资讯》TS泛型坑编译懵目录昨天写个工具函数想从对象里取属性。一编译直接报错Property key does not exist on type T。懵了这不就是个普通取属性吗错误代码// 想从obj取key但T没约束functiongetPropertyT(obj:T,key:string){returnobj[key];// 编译器Property key does not exist on type T}核心根源T是任意类型。编译器不知道key是不是obj的属性。它怕你访问不存在的属性所以直接报错。就像你让一个陌生人去开保险箱不给钥匙还说“试试看”。正确代码// K extends keyof T确保key是T的合法属性functiongetPropertyT,KextendskeyofT(obj:T,key:K){returnobj[key];// 编译器放心key在T里}对比关键错误写法正确写法T无约束K extends keyof T约束key: string可能无效key: K编译器自动检查编译报错编译通过实际用例constuser{id:1,name:Alice};getProperty(user,name);// ✅ 正确getProperty(user,age);// ❌ 编译报错age不在user里避坑总结泛型函数里只要涉及对象属性访问必须用keyof约束。别想偷懒写string编译器会给你整出一堆错误。我昨天就栽这儿debug到凌晨三点。记住keyof不是装饰品是救命稻草问自己key是T的属性吗不是就加extends keyof类型检查不是来坑你的是来防你坑自己的下次写泛型先写keyof。省的半夜被编译器怼。