给定一个对象,我想从这个对象中检索一个具有真实类型而不是联合类型的元素,请参阅我的示例
function prop(obj: Todo, key: keyof Todo) {
return obj[key];
}
interface Todo
{
id: number,
text: string,
}
const todo : Todo = {
id: 1,
text: "Buy milk",
};
const id = prop(todo, "id"); // string | number instead of number
const text = prop(todo, "text"); // string | number instead of string

我不明白为什么输入的变量ID和文字 string |数字而不是显示其真实类型?
如果我使用我的道具方法的通用方法,它可行,但我不明白为什么它有效而不是我以前的方法
function prop<T, K extends keyof T>(obj: T, key: K) {
return obj[key];
}
答案 0 :(得分:0)
因为第一种情况下函数的返回类型实际上是传递的对象键的任何可能类型。如果你要将第三个字段添加到类型的Todo接口,例如boolean,那么你的函数将返回string | number | boolean
,依此类推。
这是因为打字稿没有深入到你的函数的实现并期望它返回任何可能的键。通用有助于建立参数之间的对应关系。它并没有在第一个和第二个参数中建立Todo
的相等性。
此外,您的通用版缺少返回类型,即T[K]
希望它有所帮助!