如何省略 [key:string]: any 来自打字稿中的类型?

Der*_*rek 5 typescript

说我有

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

interface B extends A {
  banana?: number;
}
Run Code Online (Sandbox Code Playgroud)

我想要一个type C扩展 all fromA和 all from Bexcept [key: string]: any;。我想要一个type D继承所有 fromB除了 all from A

我如何制作CD打字稿?

for*_*d04 9

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

type C = Pick<B, KnownKeys<B>>;
Run Code Online (Sandbox Code Playgroud)

从 中选取所有内容B,从 中排除所有内容A,删除A索引签名:

type D = Omit<C, KnownKeys<A>>
Run Code Online (Sandbox Code Playgroud)

Type仅使用已知的属性键KnownKeys<T>删除 的索引签名T(归功于 Mihail Malostanidis 及其在这里这里的回答):

type KnownKeys<T> = {
    [K in keyof T]: string extends K ? never : number extends K ? never : K
} extends { [_ in keyof T]: infer U } ? U : never;
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

操场