【问题标题】:Is there a compile time way in TypeScript to declare a keyof type, of only the keys that map to a specific type? [duplicate]TypeScript 中是否有一种编译时方法来声明一个 keyof 类型,只有映射到特定类型的键? [复制]
【发布时间】:2021-05-14 12:53:39
【问题描述】:

假设我们有以下类型:

interface User {
    name: string
}

interface Session {
    id: string
    startTime: number
    moderator?: User
    student: User
    instructor: User
    observer: User
}

有没有办法从Session 获取keyof,这仅适用于User 类型的键?在这种情况下,这将是 "moderator" | "student" | "instructor" | "observer",但不是 "id" | "startTime"。假设在 任何 版本的 TypeScript 中(如果这已更改或正在开发语言功能),但我使用 4.1.2 作为参考。

编辑相关问题
链接的问题确实完全回答了这个问题,尽管我觉得这种更通用的措辞很有用。我还将User 字段之一设为可选,因为我的真实代码有可选值,这让我很失望。我的具体问题(基于链接的问题)的一个衬里是:

type UserKeys = {[K in keyof Session]-?: Session[K] extends User|undefined ? K : never}[keyof Session];

*如果您有可选项,请注意 -?User|undefined

【问题讨论】:

  • 在这里翻译另一个问题的答案会产生this code
  • 相关问题确实回答了我的问题,尽管我认为标题可以改进,因为答案不是特定于字符串的。

标签: typescript


【解决方案1】:

是的,有使用映射类型

type UserKeys = {
  [Key in keyof Session]: Session[Key] extends User ? Key : never
}[keyof Session]

【讨论】:

  • 这是一个正确的答案,但我认为我提出这个问题的方式应该只是链接到相关问题。
  • 当然,我同意!它还显示了一个通用解决方案
猜你喜欢
  • 2021-06-15
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 2021-03-28
  • 2018-10-26
  • 2021-04-11
  • 2021-10-24
  • 1970-01-01
相关资源
最近更新 更多