/** * Filters an object type to include only properties whose values * are assignable to a specified `ValueType`. */ type FilterPropertiesByValueType = { [P in keyof T as T[P] extends ValueType ? P : never]: T[P]; }; interface Employee { id: string; name: string; age: number; email: string; isActive: boolean; hiredDate: Date; departmentId: number | null; } // Get properties that are strings type StringProperties = FilterPropertiesByValueType; /* type StringProperties = { id: string; name: string; email: string; } */ // Get properties that are numbers type NumberProperties = FilterPropertiesByValueType; /* type NumberProperties = { age: number; } */ // Get properties that are boolean type BooleanProperties = FilterPropertiesByValueType; /* type BooleanProperties = { isActive: boolean; } */ // Get properties that are nullable numbers (number | null) type NullableNumberProperties = FilterPropertiesByValueType; /* type NullableNumberProperties = { age: number; departmentId: number | null; } */ // Get properties that are objects (excluding null) type ObjectProperties = FilterPropertiesByValueType; /* type ObjectProperties = { hiredDate: Date; // Date is an object } */