type FunctionPropertyNames‹T› = { [K in keyof T]: T[K] extends Function ? K : never }[keyof T]; type FunctionProperties‹T› = Pick‹T, FunctionPropertyNames‹T››; type NonFunctionPropertyNames‹T› = { [K in keyof T]: T[K] extends Function ? never : K }[keyof T]; type NonFunctionProperties‹T› = Pick‹T, NonFunctionPropertyNames‹T››; interface Part { id: number; name: string; subparts: Part[]; updatePart(newName: string): void; } type T40 = FunctionPropertyNames‹Part›; // "updatePart" type T41 = NonFunctionPropertyNames‹Part›; // "id" | "name" | "subparts" type T42 = FunctionProperties‹Part›; // { updatePart(newName: string): void } type T43 = NonFunctionProperties‹Part›; // { id: number, name: string, subparts: Part[] }