Để thu hẹp loại thuộc tính, đơn giản extendhoạ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 Acá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à, Omitnội bộ chỉ xem xét Exclude<keyof A, 'x'>các khóa sẽ là chung string | numbertrong trường hợp của chúng tôi. Vì vậy, Bsẽ 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 OverridePropsloạ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" };