如何从带有动态索引字段的TypeScript类型中正确省略指定key?
问题根因
你遇到的是TypeScript内置Omit工具类型的已知特性:当原类型包含字符串/数字索引签名时,Omit会优先保留索引签名,直接过滤掉所有显式声明的字段,最终只剩索引签名对应的类型定义。
解决方法
方案1:移除不必要的索引签名(最优)
如果业务上不需要User的任意字符串键索引能力,直接删掉User接口里的[x: string]: any行即可,此时原有写法就能正常生效:
interface User { avatarUrl?: string bio?: string company?: string email?: string emailVerified?: boolean firstName?: string id: types.TimeUuid } // 此时生成的类型符合预期 type UserValue = Omit<User, 'id'>
方案2:保留索引签名的场景下自定义提取逻辑
如果不能修改原User接口的定义,可以自定义工具类先提取出接口的显式声明键,再做过滤:
// 自定义工具:提取类型的显式声明键,排除索引签名对应的模糊键 type ExplicitKeys<T> = { [K in keyof T]: string extends K ? never : number extends K ? never : K } extends { [_ in keyof T]: infer U } ? U : never // 先提取显式字段,再排除id字段 type UserValue = Omit<Pick<User, ExplicitKeys<User>>, 'id'> // 如果需要保留原有的字符串索引签名,改为以下写法即可 type UserValueWithIndex = UserValue & { [x: string]: any }
最终生成的UserValue符合预期:
type UserValue = { avatarUrl?: string bio?: string company?: string email?: string emailVerified?: boolean firstName?: string }
内容的提问来源于stack exchange,提问作者Serhii Shliakhov
相关产品推荐
相关产品推荐

