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');
我曾多次尝试实现从对象中提取属性的通用函数。 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
.
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');