如何覆盖属性类型?

时间:2019-02-19 15:58:03

标签: typescript

鉴于我具有以下结构

type AB = {
    A: string;
    B: string;
}

但是现在我想创建一个新的类型,该类型不仅可以扩展键,而且可以覆盖'A'属性。因此最终类型应为

{
    A: number;
    B: string;
}

所以我尝试将AB类型分配给我的最终类型,并在'A'属性后添加新类型

type final = AB & {A: number};

但是它不起作用:( 所以我的问题是;如何将类型扩展到具有更改的属性类型的其他类型?

3 个答案:

答案 0 :(得分:1)

我不确定这是否是最优雅的解决方案,但是您可以使用映射类型过滤掉要覆盖的键,然后将其与覆盖相交:

type Override<T1, T2> = {
    [K in Exclude<keyof T1, keyof T2>]: T1[K]
} & {
    [K in keyof T2]: T2[K]
};

type final = Override<AB, { A: number }>;

答案 1 :(得分:0)

创建简单的交集(AB & {A: number})将不起作用,因为它将使所有单个属性分别相交。这意味着A的类型必须为string & number,这是不可能实现的。

改为使用此:

type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U;

用法:

type Final = Overwrite<AB, { A: number }>

答案 2 :(得分:0)

type Override<T1, T2> = Omit<T1, keyof T2> & T2;