ts如何将类型推导中的或改成且?

作者站长头像
站长
· 阅读数 14
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. 出来其他的属性呢?

回复
1个回答
avatar
test
2024-07-12

TypeScript学习8:高级类型-交叉类型、联合类型

看到这篇文章才知道,我的需求是将联合类型转化为交叉类型

解法是一条黑魔法

type UnionToIntersection<U> =
        (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never

学习更多,参考原讨论帖

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容