typescript hur man skriver om egenskapstypen för ett gränssnitt
type Old = Other & {rewrite:number};
type New = Old & {rewrite:string};
Förväntat beteende:
typ av New: Other & {rewrite:string}
Faktiskt beteende:
typ av New: Other & {rewrite:string & number}
Svar #1
Detta är det avsiktliga beteendet hos intersection-typer. Om egenskapen finns på båda medlemmarna i intersectionen kommer den resulterande egenskapstypen att vara en intersection av de ursprungliga typerna.
För att ersätta en egenskap kan vi först utesluta den från den ursprungliga typen med hjälp av Pick och 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
Vi kan till och med skapa en generisk typ för att göra ersättningen om detta är ett vanligt scenario:
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
