Skip to content

Instantly share code, notes, and snippets.

@bozdoz
Last active February 23, 2021 02:59
Show Gist options
  • Save bozdoz/9002c450f506c7e624889fa095a59793 to your computer and use it in GitHub Desktop.
Save bozdoz/9002c450f506c7e624889fa095a59793 to your computer and use it in GitHub Desktop.
types.d.ts
// https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgILIN4ChnLgIwQC5kQBXAW32h2QBMIYSBnMKUAc1o4AtgTyVGrgBWAawA2JAEoQEAeyh0APK3YgOAGlKVqUAHy0KIeQN3QA2gF0sAXyxYA9ACpnyAPIgJAT2QcIYMgADlDyQdBgwBDMyDChFMgAKsgA7jzQKABucBJkKMAx8jDIYN7hyADSyM6OWKXlnj7KidoV+sgAvMgACsAIYs3a2LgW3cigyGIQ3kVJViSJo1bIEAAekCB0MVUA-D3IAhCZNLYWUzPFiVaGTo7IEsAUwIFg8sjyXr6CesGh4VCRaJ1MooABCnQ8n2UqG032gNwUIFYJWiYBI4K6wzwhBIAEYAEwAZk03D4JAALABWABsJPsQA
/** Only get properties from T where value is of type K */
type Only<T, K> = Pick<T, {
[P in keyof T]: T[P] extends K ? P : never
}[keyof T]>
//
// Writable properties from an interface
//
type IfEquals<X, Y, A=X, B=never> =
(<T>() => T extends X ? 1 : 2) extends
(<T>() => T extends Y ? 1 : 2) ? A : B;
type WritableKeys<T> = {
[P in keyof T]-?: IfEquals<{ [Q in P]: T[P] }, { -readonly [Q in P]: T[P] }, P>
}[keyof T];
// https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgCoQM5mQbwFDLJQRwAmA9iADYCeycAXMiAK4C2ARtAch01lFABzPAF88eMDQAOKAJIwAogEcWcKhgA8ADQA0yAJr6AggF49yAEKmQEAG7QAfMlM8AFJtSO3AShfPUZAgAD0gQUgxkbWQAfmQARmQmACY-ELCI909vP1MAoNCIcMiDWISk5FSy4wrLAG4JKVlkAHVBMDgOKggAaQgaLS8XXB4AbQAFZFBkAGt+8hg0AF0AWhimBRU1DU0cZFGARSmQZHGlplQJpeRRfT2V4jJKWn2j6bOLq5v9cccxUbmNAWywakhkKDawA6XQg2WG42ACBmnn0kOh3T6A2yfzwCEoWHoTDRnW6nkwYGcphGhD4yAA5ABmOliIA
type Writable<T> = Pick<T, WritableKeys<T>>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment