首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从typescript中的动态键数组推断出类型化数组?

如何从typescript中的动态键数组推断出类型化数组?
EN

Stack Overflow用户
提问于 2018-06-09 22:31:53
回答 1查看 865关注 0票数 1

我希望输入一个泛型对象,并在一个类型化数组中返回该对象的属性。从对象中获取单一类型属性的能力是有文档记录的,并且是有效的,但是我无法将其与数组一起使用。似乎是“联合类型”。

代码语言:javascript
复制
// from the documentation 
// @ http://www.typescriptlang.org/docs/handbook/advanced-types.html
function getProperty<T, K extends keyof T>(o: T, name: K): T[K] {
    return o[name];
}

const a = getProperty(person, 'age');
// a: number
const n = getProperty(person, 'name');
// n: string

const getProperties = <T>(obj: T, keys: Array<keyof T>) => keys.map((arg) => getProperty(obj, arg));

const [a2, n2] = getProperties(person, ['name', 'age']);
// result:
// a2: string | number
// n2: string | number

// what i want:
// a2: string
// n2: number
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-10 01:06:20

问题是keys可以是T的任何键,所以当您在getProperties中调用getProperty时,结果将是T[keyof T],这意味着T的任何值。对于getProperty(person, 'age'),它是有效的,因为name将被推断为字符串文字类型'age',因此结果将是T['age'],即number

要实现您想要的功能,我们需要为要传递的每个键单独提供一个泛型参数。我们不能支持任意数量的键,但是,使用重载,我们可以支持一定数量的键,这对大多数情况都足够好(我为多达3个键添加了重载,你可以很容易地添加更多):

代码语言:javascript
复制
const person = {
    age: 1,
    name: ""
}
function getProperty<T, K extends keyof T>(o: T, name: K): T[K] {
    return o[name];
}


function getProperties<T, K extends keyof T, K2 extends keyof T, K3 extends keyof T>(obj: T, keys: [K, K2, K3]): [T[K], T[K2], T[K3]]
function getProperties<T, K extends keyof T, K2 extends keyof T>(obj: T, keys: [K, K2]): [T[K], T[K2]]
function getProperties<T, K extends keyof T>(obj: T, keys: [K]): [T[K]]
function getProperties<T>(obj: T, keys: Array<keyof T>) {
    return keys.map((arg) => getProperty(obj, arg));
} 

const [a2, n2] = getProperties(person, ['name', 'age']); // a2: string, n2: number
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50775327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档