打字稿如何重写接口的属性类型

时间:2018-11-22 14:02:52

标签: typescript

type Old = Other & {rewrite:number};
type New = Old & {rewrite:string};

预期的行为:
New的类型:Other & {rewrite:string}

实际行为:
New的类型:Other & {rewrite:string & number}

1 个答案:

答案 0 :(得分:3)

这是交叉点类型的设计行为。如果属性在交集的两个成员上都存在,则结果属性类型将是原始类型的交集。

要替换属性,我们首先可以使用PickExclude将其从原始类型中排除:

type Omit<T, TKey extends keyof T> = Pick<T, Exclude<keyof T, TKey>>

type Other = { a: number };
type Old = Other & {rewrite:number};
type New = Omit<Old, 'rewrite'> & {rewrite:string};
let n: New;
n.rewrite // string 
n.a // number

如果是常见情况,我们可以创建一个通用类型来进行替换:

type Omit<T, TKey extends keyof T> = Pick<T, Exclude<keyof T, TKey>>

type Other = { a: number };
type Old = Other & {rewrite:number, rewrite2:number};
type Replace<T, TKey extends keyof T, TKeyType> = Omit<T, TKey> & Record<TKey, TKeyType>
type New = Replace<Old, 'rewrite', string>   // replace one
type New2 = Replace<Old, 'rewrite' | 'rewrite2', string> // replace more