【发布时间】:2020-07-07 19:54:15
【问题描述】:
考虑一下 Typescript 文档中 Index types section 中的这个 sn-p:
function getProperty<T, K extends keyof T>(o: T, propertyName: K): T[K] {
return o[propertyName]; // o[propertyName] is of type T[K]
}
这个函数返回o的属性之一,并且相当复杂的类型签名确保类型检查器在编译时评估这个属性是否真的存在,这非常简洁。
对于一个不同但相似的函数,我想给propertyName一个默认值,所以它不必显式传递,即
function getProperty<T, K extends keyof T>(o: T, propertyName: K = "default"): T[K]
但编译器不喜欢这样,并在函数定义处抛出以下错误:
Type '"default"' is not assignable to type 'K'.
'"default"' is assignable to the constraint of type 'K', but 'K' could be instantiated with a different subtype of constraint 'string | number | symbol'.
我知道数字和符号(?)也可以是有效的索引,但不是为什么这会阻止我将字符串指定为 propertyName 的默认值。有人可以解释为什么这是一个问题以及是否可以解决它?
【问题讨论】:
标签: typescript typescript-typings type-constraints