说我有
interface A {
apple?: number;
[key: string]: any;
}
interface B extends A {
banana?: number;
}
我希望type C
扩展A
之外的所有内容,B
和[key: string]: any;
之外的所有内容。我希望type D
继承B
的所有内容,除了A
的所有内容。
如何在打字稿中制作C
和D
?
答案 0 :(得分:1)
从B
中选择全部,删除A
索引签名:
type C = Pick<B, KnownKeys<B>>;
从B
中选择全部,从A
中排除所有,删除A
索引签名:
type D = Omit<C, KnownKeys<A>>
类型KnownKeys<T>
仅使用已知的属性密钥来删除T
的索引签名(贷记给Mihail Malostanidis及其答案here和here):>
type KnownKeys<T> = {
[K in keyof T]: string extends K ? never : number extends K ? never : K
} extends { [_ in keyof T]: infer U } ? U : never;
类型C
和D
看起来如何?
type C = {
banana?: number | undefined;
apple?: number | undefined;
}
type D = {
banana?: number | undefined;
}
const c: C = {
apple: 1,
banana: 2,
}
const d: D = {
banana: 2
}
答案 1 :(得分:0)
我认为您不能以您认为的方式(排除[key: string]: any;
)来做到这一点,即要排除键,您必须使用键或其值类型。
相反,您可以选择所需的属性:
type C = Pick<B, 'apple' | 'banana'>;