【问题标题】:Merge conditional mapped types in typescript在打字稿中合并条件映射类型
【发布时间】:2022-08-16 21:58:59
【问题描述】:

我们使用以下基本接口使用映射类型指定类型

interface A {
    a: string
    b: number
    c: number
}

如果我们像这样用自己的键索引映射类型

type B = {
    [K in keyof A]: {
        [K_ in K]: A[K_]
    }
}[keyof A]

它将生成具有自己类型的每个键的联合

type B = {
    a: string;
} | {
    b: number;
} | {
    c: number;
}

如果我们使用上面的方法,我们用自己的键索引一个映射类型,我们可以只提取一些具有匹配类型的键,如下例所示

type C = {
    [K in keyof A]: A[K] extends number ? {
        [K_ in K]: A[K_]
    } : never
}[keyof A]

哪个会产生

type C = {
    b: number;
} | {
    c: number;
}

问题

是否可以进行我们在type C 中看到的相同条件选择,并且生成的不是联合而是完整类型,如下所示?

type C = {
    b: number;
    c: number;
}

Playground Link

    标签: typescript


    【解决方案1】:

    一种方法是使用key remapping 通过将它们重新映射到never 来删除所有不匹配的键:

    type C = {
        [K in keyof A as A[K] extends number ? K : never]: A[K]
    }
    

    【讨论】:

      猜你喜欢
      • 2022-08-17
      • 2019-12-11
      • 2019-11-19
      • 2019-10-25
      • 1970-01-01
      • 2021-01-26
      • 2022-12-07
      • 1970-01-01
      • 2018-06-16
      相关资源
      最近更新 更多