TypeScript泛型约束为何必须使用extends关键字?
关于TypeScript泛型函数
getProp的类型声明疑问解答 首先是语法层面的硬性要求:TypeScript的泛型参数声明有固定规则,泛型参数名后面如果要指定类型约束,必须用
extends关键字。你写的K keyof T本身就是非法语法——编译器根本无法识别这个写法,会直接抛出语法错误。extends是TypeScript专门用来定义泛型参数“类型边界”的关键字,没有它,就没法把K限定在keyof T这个合法键的集合里。其次是类型安全的必要性:如果不用
K extends keyof T,K会被当成不受约束的泛型参数,意味着你可以传入任何类型的key,哪怕这个key根本不是obj的属性。比如调用getProp({name: '张三'}, 'age'),无约束的情况下编译器不会报错,但运行时肯定拿不到正确的值,这就失去了TypeScript类型检查的核心意义。加上extends后,编译器会强制要求key必须是obj的有效键,从根源上避免这类错误。最后是类型推导的精确性:当你调用
getProp时,TypeScript需要自动推导T和K的类型关系。如果K没有约束为keyof T,编译器没法把K和T的键关联起来,可能会把K推导成更宽泛的类型(比如string),此时返回值T[K]会变成unknown或者所有属性类型的联合类型,完全达不到“精确获取对应属性类型”的泛型设计目的。用extends约束后,编译器能精准推导K是T的某个具体键,返回值类型也会和该键的类型完全匹配。
内容的提问来源于stack exchange,提问作者Mg Gm
相关产品推荐
相关产品推荐

