根据我的理解,以下是TypeScript的看法
const getValue = <TObj>(obj: TObj, key: keyof TObj) => {
return obj[key];
};
// equivalent to
const getValue = <TObj>(obj: TObj, key: keyof TObj): TObj[keyof TObj] => {
return obj[key];
};
const getValueMultiple = <TObj, TKey extends keyof TObj>(obj: TObj, key: TKey) => {
return obj[key];
};
// equivalent to
const getValueMultiple = <TObj, TKey extends keyof TObj>(obj: TObj, key: TKey): TObj[TKey] => {
return obj[key];
};
一开始你可能认为没有区别,但实际上是有区别的;
让我们把TObj取为{a:数字,b:字符串,c:布尔值}
TObj[keyof TObj] = TObj["a" | "b" | "c" ] = number | string | boolean
然而,关于TObj[TKey],因为TKey正是“a”|“b”|“c”中的一个,并且TypeScript通过泛型参数知道它是哪一个
TKey extends keyof TObj
,您会得到一个精确的返回类型。