Skip to content

Instantly share code, notes, and snippets.

View Oaphi's full-sized avatar
💭
☕ and 👩‍💻

Oleg Valter Oaphi

💭
☕ and 👩‍💻
  • Cursiver
  • Saint Petersburg
View GitHub Profile
@Oaphi
Oaphi / domHelpers.ts
Last active February 10, 2021 02:34
Common basic DOM helpers
export const remClasses = (
{ classList }: { classList: DOMTokenList },
...classes: string[]
) => classList.remove(...classes);
export const addClasses = (
{ classList }: { classList: DOMTokenList },
...classes: string[]
) => classList.add(...classes);
@Oaphi
Oaphi / TupleTypes.ts
Last active July 16, 2021 18:19
Useful tuple utility types
type Indices<A> = Exclude<keyof A, keyof any[]>;
type valueAtIndexToNever<T extends any[], I extends number> = {
[ P in keyof T ] : P extends Indices<T> ?
P extends `\${I}` ? never : T[P] :
T[P]
}
type test1 = valueAtIndexToNever<[1,2,3],1>; //[1, never, 3];
@Oaphi
Oaphi / TypePeculiarities.ts
Last active February 17, 2021 06:59
Peculiar types found in TS land
//@see https://github.com/microsoft/TypeScript/issues/23182#issuecomment-379091887
type swithcNever<T, A, B> = [T] extends [never] ? A : B;
//@see https://stackoverflow.com/a/63568058/11407695
type Flatten<T extends any[]> = T extends [infer U, ...infer R]
? U extends any[]
? [...Flatten<U>, ...Flatten<R>]
: [U, ...Flatten<R>]
: [];
@Oaphi
Oaphi / utilityTypes.ts
Last active February 17, 2021 08:04
General-purpose utility types
type Invert<T> = { [ P in keyof T as Extract<T[P], string | number | symbol> ] : P };
type test1 = Invert<{ a: "ia", b: "ib", c: 1 }>; //{ ia: "a"; ib: "b"; 1: "c"; }
type DeepPath<T extends string[], U> = T extends [infer F, ...infer L]
? F extends string
? { [P in F]: L extends string[] ? DeepPath<L,U> : never }
: {}
: U;
@Oaphi
Oaphi / gulp.sh
Last active October 31, 2021 05:45
Gulp workflow
# if gulp CLI is not installed
npm i -g gulp-cli
# gulp package
npm i -D gulp @types/gulp
# TypeScript prerequisites
# ts-node is required for gulpfile.ts
npm i -D typescript ts-node
@Oaphi
Oaphi / E164format.ts
Last active June 13, 2021 15:06
Types for checking if phone is in E164 format
type Digit = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "0";
type EveryOfType<A extends readonly any[], T> = keyof {
[P in Exclude<keyof A, keyof any[]> as A[P] extends T ? never : P]: P;
} extends never
? true
: false;
type SplitString<
T extends string,
@Oaphi
Oaphi / bash-helpers.sh
Last active August 31, 2021 00:46
Various bash helpers
# extracts NPM environment variable names
npm_val() {
local value=$(ENV | grep -e "npm_package_$1" | cut -d "=" -f 2)
echo $value
}
# splits a string on dashes and rejoins with first letter uppercased
pretty() {
IFS=\-
local output
@Oaphi
Oaphi / lens.ts
Created October 2, 2021 01:02
Deep lens into an object
type NestedObj = {
[x: string]: string | number | boolean | null | undefined | NestedObj;
};
const lens = (obj: NestedObj, path: string) => {
const parts = path.split(".");
const [lastPart] = parts.slice(-1);
let current: NestedObj = obj;
for (const part of parts) {
@Oaphi
Oaphi / union-print.ts
Created October 2, 2021 04:12
Print string union
type PrintStringUnion<T extends string, S extends string = "|", A extends string = ""> = {
[P in T]: [T] extends [P] ? `${A}${P}` : PrintStringUnion<Exclude<T, P>, S, `${A}${P}${S}`>
}[T];
type TestUnion = "A" | "B" | "C" | "D" | "E";
type U = PrintStringUnion<TestUnion>;
const test1: U = "A|B|C|D|E"; // OK
@Oaphi
Oaphi / deep-omit.ts
Created October 17, 2021 23:11
Utility types and helper for deeply omitting a field from an object
type DeepKeyof<T, A = never> = { [P in keyof T]: T[P] extends object ? P extends A ? P : DeepKeyof<T[P], A | keyof T> | P : P }[keyof T];
type DeepOmit<T, U extends DeepKeyof<T>> = {
[P in keyof T as P extends U ? never : P]: T[P] extends object ?
keyof DeepOmit<T[P], Extract<U, DeepKeyof<T[P]>>> extends never ?
{} :
DeepOmit<T[P], Extract<U, DeepKeyof<T[P]>>> :
T[P]
};