为何TypeScript允许构建无效的Partial对象?
为什么
buildPartialBad未触发TypeScript类型错误? 我们拆解两个版本的类型逻辑就能明白原因:
错误版本buildPartialBad的问题
在buildPartialBad里,参数类型是:
key: keyof A:允许传入'a'或'b'中的任意一个val: A[keyof A]:这里的A[keyof A]是A所有属性值类型的联合类型,也就是number | string
TypeScript在这里只会做独立的类型检查:只要val是number或string就符合要求,不会把key的具体值和val的类型做关联匹配。所以当你传'a'(对应值类型应该是number)和'hello'(string属于联合类型成员)时,TypeScript认为参数符合类型定义,不会报错。
正确版本buildPartialGood的作用
泛型版本<K extends keyof A>的核心是绑定了键和值的具体类型关系:
- 当你传入具体的
key(比如'a'),TypeScript会把泛型K推断为该键的字面量类型'a' - 此时
val: A[K]就被锁定为A['a']也就是number,传string类型的'hello'自然会触发类型不匹配的编译错误
这种泛型写法让TypeScript能追踪key和val的对应关系,确保每个键都传入正确类型的值。
内容的提问来源于stack exchange,提问作者f-g-p
相关产品推荐
相关产品推荐

