@pastable/typings

A bunch of utility types.

Usage no npm install needed!

<script type="module">
  import pastableTypings from 'https://cdn.skypack.dev/@pastable/typings';
</script>

README

@pastable/typings

A bunch of utility types.

List

PrimitiveValue

Quickly target a primitive value.

type PrimitiveValue = string | number | boolean;

Primitive

Either PrimitiveValue or an array of PrimitiveValue

type Primitive = PrimitiveValue | Array<PrimitiveValue>;

ObjectLiteral

Pre-configured record for most common uses.

type ObjectLiteral<T = any> = Record<string, T>;

JSONValue

Possible JSON value. https://github.com/Microsoft/TypeScript/issues/3496

type JSONValue = PrimitiveValue | JSONObject | JSONArray;

JSONObject

JSON object.

interface JSONObject {
    [x: string]: JSONValue;
}

JSONArray

JSON array.

interface JSONArray {
    [x: string]: JSONValue;
}

Unpacked

Extract a generic type from where its used. https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html

type Unpacked<T> = T extends (infer U)[]
    ? U
    : T extends (...args: any[]) => infer U
    ? U
    : T extends Promise<infer U>
    ? U
    : T;

CType

Get the constructor of a class.

type CType<T = any> = new (...args: any[]) => T;

AnyFunction

Literraly allow for any function, has return/args generics.

type AnyFunction<Return = any, Args = any> = (...args: Args[]) => Return;

FunctionArguments

Get arguments as array from a function type.

type FunctionArguments<T extends Function> = T extends (...args: infer R) => any ? R : never;

// ex
type Ding = (aaaa: string, bbb: number) => void;
type Dong = FunctionArguments<Ding>;

ArrayUnion

Get a union type from a const array.

type ArrayUnion<T extends Readonly<string[]>> = T[number];

// ex
const keys = ["aaa", "bbb", "ccc"] as const;
type Keys = ArrayUnion<typeof keys>;
// type Keys = "aaa" | "bbb" | "ccc"

DeepPartial

Same as Partial<T> but goes deeper and makes Partial<T> all its properties and sub-properties. https://github.com/typeorm/typeorm/blob/master/src/common/DeepPartial.ts

type DP<T> = {
    [P in keyof T]?: T[P] extends Array<infer U>
        ? Array<DeepPartial<U>>
        : T[P] extends ReadonlyArray<infer U>
        ? ReadonlyArray<DeepPartial<U>>
        : DeepPartial<T[P]>;
type DeepPartial<T> = { [P in keyof T]?: T[P] | DP<T> }

NonUndefined

Ensure that <T> is not undefined.

type NonUndefined<A> = A extends undefined ? never : A;

NonFunctionKeys

Can be used to retrieve class properties.

type NonFunctionKeys<T extends object> = {
    [K in keyof T]-?: NonUndefined<T[K]> extends Function ? never : K;
}[keyof T];

// ex
class Example {
    stringType: string;
    numberType: number;
    booleanType: boolean;
    nullType: null;
    functionType: () => void;
}
type Dang = NonFunctionKeys<Example>;
// type Dang = "stringType" | "numberType" | "booleanType"