Skip to content

Instantly share code, notes, and snippets.

@zeusdeux
Last active October 17, 2022 15:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zeusdeux/8c3740671e9d548b5f0234adbeecc5c1 to your computer and use it in GitHub Desktop.
Save zeusdeux/8c3740671e9d548b5f0234adbeecc5c1 to your computer and use it in GitHub Desktop.
Filtering keys from an object type based on type of value for the keys
type MixedObject = {
someFn(x: number): string
someProp: symbol
}
// using key remapping that was added in TS 4.1 wherein
// if we return `never` as a value for key in the remapping logic
// the key is dropped from the resulting type
// More: https://www.typescriptlang.org/docs/handbook/2/mapped-types.html#key-remapping-via-as
type Filter<InputType, AllowedValueTypes> = {
[key in keyof InputType as InputType[key] extends AllowedValueTypes ? key : never]: InputType[key]
}
type OnlyFunctionKeysInObject = Filter<MixedObject, Function> // { someFn: (x: number) => string; }
type OnlySymbolKeysInObject = Filter<MixedObject, symbol> // { someProp: symbol; }
type SameAsMixedObject = Filter<MixedObject, Function | symbol> // { someFn: (x: number) => string; someProp: symbol; }
// Playground link: https://www.typescriptlang.org/play?#code/C4TwDgpgBAsglgDwgEwPICMBWEDGwoC8UA3gFBRQDOA9gLYQBiAdgBQIBcUTArrehACcAlJ0rABcJgHNyVOhAAKA6mFEg+1ADakAvqVIB6A1G6VJUqAGsIIKAIi0AhmDDmowABaP8Ad0eUoR2RkFChJKAAVAGUoABYAOgBGKB8PQQhJQ2M4ADMU6HtgbgEmKAADJggAN0EywIDHKCrHTW5oHOoBKxsw0s8Ch2dXaShNaik4HCz3NO7bOADkZRdQnOVaGYHKbk1gN1BIaZhOiE4PYGAwSnYjHzv4g4hKHAkwYE1HaXjOqQNkahwlAMXiYyHQ1GolgMACYDE4VsgALSPSjxc60TQAYmsIER9nhwykiKqcEciP8pEeUAYcF2ggAPABJJhgbjACLgCAAGigAEFNGMfCgAGotNocyCUAB8hBIsgA2jjenNqHlmaz2Zz6lB1WyJRBFTYALpQCAIYAQUEBfmCkViiD6gIAfjmUE4lRqAiNnF1msghpARt0+ipqCYmhADG4TDwcGoTAA0jZKMyMNg8LKaXSBPT4Eg0FhcMAeVGY3t4zKjCQ5PRmJw2O7ePxhIQZWIJNIANxQPSh8MgKLqcGaJMgFNMNNFzO0i05vMoSd4HmUIdaSvGYg1xTLNQaTTd3taqKOei8yjzgvp-BELOz3OIBeFpfU6Ox+NQAA+VFXmnX1ZotZMPWHBcE2ghCK2VDiOY3YAduKi7sOB76FWCgfCAUjKNGyCjJIlhnBcVw3AYdw+A8nLPK87yfFI3wCL8YDoU6mI4NQIQGAAwrEEQ+AAIlIYBSAAQmeUiaFIvE+FIACiPgKIyHEwEJADq0m8QA4j41AcQAHAAqryADMUgMEJABKACKvGoLyACcUgADIAJoWUJcC8sgwkWYyQk4HpES8gI9geLyHE4PyABSAAMAi8r5EVSAAEgAciAwqoCFvIJryABstAMNJUgANSJLyvGOJYvJVAAjsKPk5byiTqTlwoRXp1W8upKaMtljJwFFvIeLQvG8bQ1A+HFjgKDpHlRRAenUGZ0JmZYDAcR4EXZbywqdQtcVObyqDCepCZCTpCgWRZG0WdCMCxGVMB6TliXAFI6AybQW28QlUi8slUXSSAPiMrxiUJhxAiJREykAKzUIlqDUEJCYIJQPhRZQOnrdCyAABqOFEHjJY4cCWLEiUcQAXoZyWoAA7OgNm8ZYABaZnIBZE6iupTlg+gliJFIyWJEJjKOCzHioHA0mxAoTnqbyPhREwTmYIllNVLEUixB4CaJbylg+E50mJIlji45gqDVRZyWWI4Hg+JovIwLjcBOSAiUWU1WhSDAoVObxMvCpQv0OVEChRJgCA4DlUURBZvJObQKbSWZtlMA7ICWHACbVTg0k4HA01gNJ82JzgDDQlIv0KHFEURR4b2YKFDlSBxvKdXAv3SQwyXqTAOQcb96nUMAyUAiAHEGWdHiiyHvLQpg2BMMl1WJZoTiU9CLOUzlmhCYkykgBFZlCQwEQHQ5YAWe3jIHRZenSUJOS0BxljCnAcC8TlUiMryOSYFoI-WImgzIdTgMlJgDBEjJykB4MAvIzLACikVOAYBqocSTiFDS3FJI4BHgFXkUVMAswTDAEAMBkpSB0g5BM5sohCQUBEWIhUooMA8DgP2EBhQ80MsAWIiRaHCmqj4BAI9uBgB8CzSEIBeR6SiujKKuMYB0yiA5CItAdIYWhMZCAbMcqJBUAZUgQA
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment