プロパティのタイプを絞り込むために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" }; // no error on b.y!
その理由は、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" }; // error: b.y should be boolean!