Return 属性 来自具有正确类型的对象,使用打字稿中的泛型类型

Return property from object with correct type using generic typing in typescript

我曾多次尝试实现从对象中提取属性的通用函数。 Typescript 中下面的代码是 returns string |数字,虽然我想让它知道它会 return 一个字符串或一个数字。在普通的 JS 中,我知道下面的代码会 return 一个字符串并做出相应的反应,所以我希望可以阐明如何在 Typescript 中解决这个问题。

interface Person {
  name: string;
  age: number;
}

const getPropertyByKey = (
  person: Person
) => (
  key: keyof Person
) => person[key];

const person = {
  name: 'Thomas',
  age: 32
};

const property = (person)('name'); // Should realise it is a string

我想你必须告诉TS你想要什么。它有点冗长:

const getPropertyByKey = (person: Person) => (key:any) => 
  "number" === typeof key ? person["age"] : person["name"];

这应该适用于您的示例

function prop<T, V extends keyof T>(val: T, key: V): T[V] {
  return val[key];
}


const prop1 = prop({ id: 1, name: 'Pete' }, 'id'); // number
const prop2 = prop({ id: 1, name: 'Pete' }, 'name'); // string

使部分函数泛化,它将能够根据 key.

的特定字符串值推断出 return 值的类型
interface Person {
  name: string;
  age: number;
}

const getPropertyByKey = (
  person: Person
) => <K extends keyof Person>(
  key: K
) => person[key];

const person = {
  name: 'Thomas',
  age: 32
};

const property = getPropertyByKey(person)('name');

Playground Link