如何忽略[key:string]:打字稿中的任何内容?

时间:2019-10-03 09:36:54

标签: typescript

说我有

interface A {
  apple?: number;
  [key: string]: any;
}

interface B extends A {
  banana?: number;
}

我希望type C扩展A之外的所有内容,B[key: string]: any;之外的所有内容。我希望type D继承B的所有内容,除了A的所有内容。

如何在打字稿中制作CD

2 个答案:

答案 0 :(得分:1)

B中选择全部,删除A索引签名:

type C = Pick<B, KnownKeys<B>>;

B中选择全部,从A中排除所有,删除A索引签名:

type D = Omit<C, KnownKeys<A>>

类型KnownKeys<T>仅使用已知的属性密钥来删除T的索引签名(贷记给Mihail Malostanidis及其答案herehere):

type KnownKeys<T> = {
    [K in keyof T]: string extends K ? never : number extends K ? never : K
} extends { [_ in keyof T]: infer U } ? U : never;

类型CD看起来如何?

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
}

Playground

答案 1 :(得分:0)

我认为您不能以您认为的方式(排除[key: string]: any;)来做到这一点,即要排除键,您必须使用键或其值类型。

相反,您可以选择所需的属性:

type C = Pick<B, 'apple' | 'banana'>;