type Old = Other & {rewrite:number};
type New = Old & {rewrite:string};
预期的行为:
New
的类型:Other & {rewrite:string}
实际行为:
New
的类型:Other & {rewrite:string & number}
答案 0 :(得分:3)
这是交叉点类型的设计行为。如果属性在交集的两个成员上都存在,则结果属性类型将是原始类型的交集。
要替换属性,我们首先可以使用Pick
和Exclude
将其从原始类型中排除:
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