TypeScript 中是不是有一种编译时方法来声明一个 keyof 类型,只有映射到特定类型的键? [复制]

Posted

技术标签:

【中文标题】TypeScript 中是不是有一种编译时方法来声明一个 keyof 类型,只有映射到特定类型的键? [复制]【英文标题】: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。 相关问题确实回答了我的问题,尽管我认为标题可以改进,因为答案不是特定于字符串的。 【参考方案1】:

是的,有使用映射类型

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

【讨论】:

这是一个正确的答案,但我认为我提出这个问题的方式应该只是链接到相关问题。 当然,我同意!它还显示了一个通用解决方案

以上是关于TypeScript 中是不是有一种编译时方法来声明一个 keyof 类型,只有映射到特定类型的键? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当用户单击 Fx 按钮时,是不是有一种方法可以使 UDF 提供类似于本机 Excel 函数的描述?

在调用 Web 服务时,是不是有一种简单的方法来获取请求的肥皂消息和响应的肥皂消息?

TypeScript:如何在编译时声明固定大小的数组以进行类型检查

当您使用 Python 的 Paramiko 库进行 SSH 并从远程机器的 CLI 获取输出时,是不是有一种简单的方法可以消除垃圾值?

当您使用 Python 的 Paramiko 库进行 SSH 并从远程机器的 CLI 获取输出时,是不是有一种简单的方法可以消除垃圾值?

当您使用 Python 的 Paramiko 库进行 SSH 并从远程机器的 CLI 获取输出时,是不是有一种简单的方法可以消除垃圾值?