从打字稿中的对象获取特定类型的所有键[重复]

Posted

技术标签:

【中文标题】从打字稿中的对象获取特定类型的所有键[重复]【英文标题】:Get all keys of specific type from object in typescript [duplicate] 【发布时间】:2021-01-22 23:54:45 【问题描述】:

标题说明了一切,但最好举个例子。

interface A 
  key1: string
  key2: string
  key3: number


type KeysOfType<O, T> = keyof 
  [K in keyof O]: O[K] extends T ? O[K] : never


function test<O,T>(obj: O, key: KeysOfType<O,T>) 
  obj[key] // should only be of type T


const aa: A = 
  key1: "1",
  key2: "2",
  key3: 3


test<A,string>(aa, "key1") // should be allowed, because key1 should be a string
test<A,string>(aa, "key3") // should NOT be allowed (but is), because key3 should be a number

但是,这允许任何keyof 接口A。 (即,上述两个调用都是有效的)。

可以用打字稿来做到这一点吗?

【问题讨论】:

这能回答你的问题吗? How to get a subset of `keyof T` whose value, T[K] are callable functions in Typescript 简而言之,是的,您的答案是正确的。但是,我希望输入也能在函数内部工作(即 obj[key] 将被推断为类型 T),但事实并非如此。我可以看到这是不可能的或支持的,因为它有点复杂。类型系统需要知道key 只会从obj 中提取T 类型的值。 【参考方案1】:

将您的 KeysofType 定义更改为:

type KeysOfType<O, T> = 
  [K in keyof O]: O[K] extends T ? K : never
[keyof O]

这在this post中有详细解释。

【讨论】:

以上是关于从打字稿中的对象获取特定类型的所有键[重复]的主要内容,如果未能解决你的问题,请参考以下文章

字符串枚举类似于打字稿中的类型[重复]

在打字稿中获取字典/对象键作为元组

如何使用打字稿中的查找来推断类型化的 mapValues?

在打字稿中查找3个数组中的共同元素[重复]

在打字稿中连接两个对象[重复]

打字稿中具有联合类型键的松散类型对象