例如,我想了解为什么给定一个对象类型
type Obj = {
readonly color: string;
};
以及获取其 colored颜色 的函数
const getColor = <const T extends Obj>(obj: T) => obj.color;
getColor({color:"blue"});
obj.color
的类型是string
,而不是默认的T["color"]
.要获得实际值,我们必须显式地键入返回.
const getColor = <const T extends Obj>(obj: T):T['color'] => obj.color;
但是,如果我们有一些更一般的函数来获取给定关键字的任何属性的值:
const getPropertyValue = <const T extends Obj, K extends keyof T>(obj: T, key:K) => obj[key];
那么obj[key]
的类型就是T[K]
.
所以我猜这不是一个类型安全问题,或者Typescript 无法识别类型. 所以我想知道这样做是否有原因,以及是否有某种方法,除了显式地键入返回,以索引访问的形式获取返回.
这是可行的,但可能没有必要.
const getPropertyValue = <const T extends Obj, K extends keyof T>(obj: T, key:K) => obj[key];
const getColor = <const T extends Obj>(obj:T)=>getPropertyValue(obj,"color")
const c1 = getColor({color:"blue"}); //returns blue
我可以认为这可能不是一个泛型问题,因为如果不访问属性并且只返回值,类型就不会扩大.
这里有一个指向typescript playground的链接,带有这个代码.