속성 유형을 좁히려면 Nitzan의 대답extend
과 같이 간단한 작업이 완벽합니다 .
interface A {
x: string | number;
}
interface B extends A {
x: number;
}
유형을 넓히거나 일반적으로 재정의 하려면 Zskycat의 솔루션 을 사용할 수 있습니다 .
interface A {
x: string
}
export type B = Omit<A, 'x'> & { x: number };
그러나 인터페이스 A
가 일반 인터페이스를 확장하는 A
경우를 사용할 때의 나머지 속성 의 사용자 지정 유형을 잃게됩니다 Omit
.
예 :
interface A extends Record<string | number, number | string | boolean> {
x: string;
y: boolean;
}
export type B = Omit<A, 'x'> & { x: number };
let b: B = { x: 2, y: "hi" };
그 이유는 Omit
내부적 으로 우리의 경우 Exclude<keyof A, 'x'>
일반적인 키만 다루기 때문입니다 string | number
. 따라서 유형이 인 추가 속성 B
이 {x: number; }
되고 허용 number | string | boolean
됩니다.
이를 해결하기 위해 OverrideProps
다음과 같은 다른 유틸리티 유형을 생각해 냈습니다 .
type OverrideProps<M, N> = { [P in keyof M]: P extends keyof N ? N[P] : M[P] };
예:
type OverrideProps<M, N> = { [P in keyof M]: P extends keyof N ? N[P] : M[P] };
interface A extends Record<string | number, number | string | boolean> {
x: string;
y: boolean;
}
export type B = OverrideProps<A, { x: number }>;
let b: B = { x: 2, y: "hi" };