Để thu hẹp loại thuộc tính, đơn giản extend
hoạt động hoàn hảo, như trong câu trả lời của Nitzan :
interface A {
x: string | number;
}
interface B extends A {
x: number;
}
Để mở rộng hoặc thường ghi đè loại, bạn có thể thực hiện giải pháp của Zskycat :
interface A {
x: string
}
export type B = Omit<A, 'x'> & { x: number };
Nhưng, nếu giao diện của bạn A
đang mở rộng giao diện chung, bạn sẽ mất các loại tùy chỉnh của A
các thuộc tính còn lại khi sử dụng Omit
.
ví dụ
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" };
Lý do là, Omit
nội bộ chỉ xem xét Exclude<keyof A, 'x'>
các khóa sẽ là chung string | number
trong trường hợp của chúng tôi. Vì vậy, B
sẽ trở thành {x: number; }
và chấp nhận bất kỳ thuộc tính bổ sung nào với loại number | string | boolean
.
Để khắc phục điều đó, tôi đã nghĩ ra một OverrideProps
loại tiện ích khác như sau:
type OverrideProps<M, N> = { [P in keyof M]: P extends keyof N ? N[P] : M[P] };
Thí dụ:
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" };