TypeScript中keyof无法获取交叉类型键的问题求助
解决TypeScript交叉类型含索引签名时keyof无法获取具体字段的问题
问题根源
你的MyDocument交叉类型中,RequestDataBody包含[x: string]: any字符串索引签名。在TypeScript中,只要交叉类型里有一个成员带有索引签名,keyof操作符返回的类型就会被“拉平”成索引签名的类型(这里是string | number),而非具体定义的字段名,因此编辑器无法给出字段提示。
解决方案
定义一个自定义类型KnownKeys,过滤掉索引签名带来的泛型键,只保留类型中显式定义的具体字段:
// 提取类型中所有显式定义的字段(排除索引签名) type KnownKeys<T> = keyof { [K in keyof T as string extends K ? never : number extends K ? never : K]: T[K] };
然后修改函数的参数类型,使用KnownKeys<MyDocument>替代keyof MyDocument:
export async function getAllDocsFields(selectOption?: Array<KnownKeys<MyDocument>>) { const fields = selectOption ? selectOption.join(" ") : ""; return fields; }
原理说明
KnownKeys通过条件类型遍历T的所有键:
- 如果键
K是string(对应字符串索引签名)或number(对应数字索引签名),就将其排除(返回never) - 仅保留那些具体命名的键,最终
KnownKeys<MyDocument>会包含id、storeName、description、logo、status、verified、categories、socialMedia等所有显式定义的字段,编辑器就能正常给出字段提示了。
内容的提问来源于stack exchange,提问作者Marya
相关产品推荐
相关产品推荐

