baz: number;
}
есть type Optional<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> & Partial<Pick<T, K>>; который в T из обязательных ключей превращает в необязательные определенные ключи K:
type NewFoo = Optional<Foo, 'bar'>; // { bar?: string; baz: number; }
однако он не работает, если в Foo будет [key: string]: any
interface Foo {
bar: string;
baz: number;
[key: string]: any;
}
type NewFoo = Optional<Foo, 'bar'>; // { bar?: string; [key: string]: any }
можно что-то сделать, чтобы Optional игнорировал [key: string]: any;?
playground
пофиксил этой конструкцией: export type KnownKeys<T> = { [K in keyof T]: string extends K ? never : number extends K ? never : K } extends { [_ in keyof T]: infer U } ? U : never; export type Optional<T, K extends keyof T> = Pick<T, Exclude<KnownKeys<T>, K>> & Partial<Pick<T, K>>;
Обсуждают сегодня