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[] }