type DataStore = {
[K in pageName]: {
page: K
data: A[K] extends { roleId: string }[] ? A[K] : never
}
}[keyof A]
interface A extends Record<pageName, unknown> {
[pageName.q]: DataA[]
[pageName.w]: DataB[]
}
enum pageName {
q = '1',
w = '2',
e = '3',
//...
}
interface DataA { roleId: string, name:string }
interface DataB { roleId: string, age: string }
let info: Record<number, DataA> | Record<number, DataB>; // 请求发过来的数据
(Object.entries(info) as unknown as [string, DataStore['data'][number]][])
.map(([page, data]) => {
// 这里data的推导类型是 DataA | DataB
// 但我希望是 DataA & DataB
})
我打算在map里面统一处理,但是现在的推导类型让我只能 拿到data.roleId
这一个值,其他的值被类型检查否了。我该如果修改,使得我能用data.
出来其他的属性呢?
TypeScript学习8:高级类型-交叉类型、联合类型
看到这篇文章才知道,我的需求是将联合类型转化为交叉类型
解法是一条黑魔法
学习更多,参考原讨论帖