typescript - 如何从记录类型创建区分联合类型?

标签 typescript

是否可以创建一个映射|条件类型,使得任何类型,如

interface Car {
    color: string
    max_speed: number
    doors: number
}

type CarPorperties = SomeMappedAndConditiomalType<Car>

会导致
type CarProperties =
    {color: string}
    |{max_speed: number}
    |{doors: number}

最佳答案

事实证明这是可能的:将属性类型映射到类似 { __tag: k, [k]: T[k] } 的内容。 ,然后取这些类型的并集。这给出了一个标记联合类型,其中 __tag property 是判别式。

用法示例:

interface Car {
    color: string
    max_speed: number
    doors: number
}

type Test = ObjectToTaggedUnion<Car>

/*
 * Test = { __tag: 'color', color: string }
 *      | { __tag: 'max_speed', max_speed: number }
 *      | { __tag: 'doors', doors: number }
 */ 

下面实现。细节有点棘手,因为 Typescript 并没有让对象类型变得容易,其中 __tag属性按字面命名,但 k属性(property)不是。

type ObjectToTaggedUnion<T> = {
    [K in keyof T]: K extends string
        ? { [kk in K | '__tag']: kk extends '__tag' ? K : T[K] }
        : never
}[keyof T];

Playground Link

关于typescript - 如何从记录类型创建区分联合类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58953212/

相关文章:

javascript - 如何为 React PropTypes 使用 typescript jsdoc 注释

typescript - 将通用 typescript 类型限制为单个字符串文字值,不允许联合

typescript - 从第三方定义文件扩展接口(interface)

TypeScript:可索引类型,string[] 不可赋值

javascript - 如何将 puppeteer-core 与 Electron 一起使用?

angular - 错误 : Angular CLI v10. 1.0 及更高版本(没有 `tsconfig.base.json` )

typescript - 无法解析模块 'module://graphql/language/parser.js'

angular - 使用 Angular 2 路由器(版本 3)进行相对导航

angular - 如何从 ReactivForms 中的 FormControl 返回图像名称

typescript - 使用 TypeScript 更新对象属性