【问题标题】:Typescript - Anyway to achieve the following idea: typeof T[keyof T]打字稿 - 无论如何要实现以下想法: typeof T[keyof T]
【发布时间】:2021-05-17 13:09:15
【问题描述】:

我一直在搜索,但似乎找不到答案,或者我可能正在搜索错误的元素。

但是正如我能够使用 keyof T 来表达一个联合类型的访问器,其中 T 是一个泛型类型,有没有办法获得这些相应键的伴随类型?

举个例子,假设我们有以下对象:

interface Data {
    name: string,
    age: number
}

还有一个通用方法:

const genericMethod = <T>(key: keyof T) => {
  console.log(key) // --> "name", "age"

  // Pseudo code idea, the idea is to get the appropriate type that correspond to our keyof
  console.log(typeof T[key]) // --> "string", "number"
}

使用 Data 类型作为我们的泛型调用此方法将按预期产生一个联合类型键,该键包含我们的 Data 接口的所有属性,但我也希望能够推断它们各自的类型。

genericMethod<Data>(keyof Data);

【问题讨论】:

  • 推断?做什么的?您的伪代码显示了一些本质上不可能的事情,因为类型(实际上是接口)在运行时不存在,因此您无法记录它们。
  • @IngoBürk 感谢您的快速回答,我似乎一直在以错误的方式看待这个问题,正如我在下面对 choz 的回答中所描述的那样。正如你们正确指出的那样,我想记录它们,但我想我必须找到另一种方法

标签: typescript typescript-generics


【解决方案1】:

您正在尝试记录接口,它们仅指一种类型,但您正在尝试将其记录为值。

如何实现typeof T[keyof T]

也许这就是你要找的东西;

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

const genericMethod = <T>(TObject: T, key: keyof T) => {
  console.log(TObject) // --> "name", "age"

  // Pseudo code idea, the idea is to get the appropriate type that correspond to our keyof
  console.log(typeof TObject[key]) // --> typeof T[keyof T]?
}

const obj: Data = {
  name: 'Bob',
  age: 15
}

genericMethod<typeof obj>(obj, 'age');

【讨论】:

  • 谢谢!打字稿的新手,整个不是运行时性质的。我想记录界面是完全正确的。但无论如何,这是不可能的,我进行了一次健全性检查,这不仅仅是因为我无法从树上看到森林。
  • Kotlin 有reified types 允许在运行时访问泛型的类型信息。也许有一天 TS 也会提供这样的东西 :) blog.mindorks.com/what-are-reified-types-in-kotlin
猜你喜欢
  • 2021-09-22
  • 1970-01-01
  • 2022-01-21
  • 2021-11-10
  • 2020-06-15
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多