可以创建连接两个字段的打字稿类型吗?

Posted

技术标签:

【中文标题】可以创建连接两个字段的打字稿类型吗?【英文标题】:Can a typescript type be created that concatenates two fields? 【发布时间】:2020-10-05 09:23:01 【问题描述】:

我想做这样的事情:

interface Apple 
  type: string;
  color: string;


type RealApple = WithConcat<Apple, 'type', 'color'>;

所以RealApple 的结果类型是:

type RealApple = 
  type: string;
  color: string;
  'type#color': string;

这可能吗?我怎样才能实现WithConcat?原因是在与数据库通信时处理类型,其中复合排序键是从其他两个字段创建的,而这些字段在架构上实际上并没有该复合。

【问题讨论】:

【参考方案1】:

如果有一个实现你的接口的类呢?

interface Apple 
    type: string;
    color: string;


class RealApple implements Apple 
    constructor(public type: string = "", public color: string = "") 
    

    // this is the equivalent of your composite key.
    public get typeAndColor(): string 
        return `$this.type_$this.color`;
    

    public static fromApple(apple: Apple): RealApple 
        return new RealApple(apple.type, apple.color);
    


const apple: RealApple = RealApple.fromApple(
    type: "braeburn",
    color: "red"
);

apple.typeAndColor; // braeburn_red

【讨论】:

【参考方案2】:

这是我想出的解决方案,它不是直接的打字稿类型,而是完成了我需要的:

function withConcat<T>(item: T, field1: keyof T, field2: keyof T) 
  return 
    ...item,
    [`$field1#$field2`]: `$item[field1]#$item[field2]`
  


【讨论】:

以上是关于可以创建连接两个字段的打字稿类型吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中合并或连接两个地图列表? [复制]

打字稿扩展了两个像类型一样的接口?

带有打字稿的猫鼬,来自猫鼬的错误“连接”

如何在打字稿上制作多种类型的属性接口

在这种情况下,打字稿可以做联合类型断言吗?

我如何结合两个 gulp 任务