Skip to content

Instantly share code, notes, and snippets.

@kdmadej
kdmadej / observable.ts
Last active September 8, 2021 15:26
Observable
type Callback<T> = (newValue: T, oldValue: T) => void;
type SetDeleteResult<T> = ReturnType<Set<T>['delete']>
type CleanUp<T> = () => SetDeleteResult<T>;
export type UnwrappedObservable<T> = T extends Observable<infer R> ? R : never;
export interface Observable<T> {
get(): T;
@kdmadej
kdmadej / CamelCase.ts
Created February 12, 2021 15:22
TypeScript template string literal type casing
type DefaultSeparator = '_' | '-';
type CamelCase<S extends string, Separator extends string = DefaultSeparator, Beginning extends boolean = true>
= S extends `${infer Character}${infer Rest}`
? Character extends Separator
? `${CamelCase<Capitalize<Rest>, Separator, Beginning>}`
: `${Beginning extends true ? Lowercase<Character> : Character}${CamelCase<Rest, Separator, false>}`
: '';
// Example: type T = "awaBbbCcc"