在TypeScript中是否有一种编译时的方式来声明一个类型的键,只有映射到特定类型的键?



假设我们有以下类型:

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,如果你有可选的。

可以使用映射类型

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

最新更新