UNPKG

@digicms/cms

Version:

An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MySQL, MariaDB, PostgreSQL, SQLite

96 lines (88 loc) 2.34 kB
/** * * Common utilities used across Strapi typings * * */ /** * * Extract the array values into an union type * **/ export type GetArrayValues<T extends Array<unknown>> = T extends Array<infer U> ? U : never; /** * Creates a record where every key is a string and every value is `T` */ export type StringRecord<T> = Record<string, T>; /** * Retrieve object's (`T`) keys if they extends the given `U` type. * * @example * type X = KeysBy<{ foo: 'bar', bar: 'foo', foobar: 2 }, string> * // 'foo' | 'bar' * * type Base = { x: 'foo' | 'bar' }; * type Obj = { foo: { x: 'foo' }, bar: { x: 'bar' }, other: { x: '42' } }; * type X = KeysBy<Obj, Base> * // 'foo' | 'bar' */ export type KeysBy<T, U> = { [key in keyof T]: T[key] extends U ? key : never; }[keyof T]; /** * Retrieve object's (`T`) properties if their value extends the given `U` type. * * @example * type X = KeysBy<{ foo: 'bar', bar: 'foo', foobar: 2 }, string> * // { foo: 'bar', bar: 'foo' } * * type Base = { x: 'foo' | 'bar' }; * type Obj = { foo: { x: 'foo' }, bar: { x: 'bar' }, other: { x: '42' } }; * type X = KeysBy<Obj, Base> * // { foo: { x: 'foo' }, bar: { x: 'bar' } } */ export type PickBy<T, U> = Pick<T, KeysBy<T, U>>; /** * Assign a default value `U` to `T` if `T` is of type `never` * * @example * type X = NeverGuard<{ foo: 'bar' }, string> * // { foo: 'bar' } * * type X = NeverGuard<never> * // unknown * * type X = NeverGuard<never, string> * // string */ export type NeverGuard<T, U = unknown> = [T] extends [never] ? U : T; /** * Dynamic type based on the keys of `Strapi.Schemas`. * It represents all the registered schemas' UID as a union type. * * @example * * declare global { * namespace Strapi { * interface Schemas { * 'api::foo.foo': CollectionTypeSchema; * 'api::bar.bar': ComponentSchema; * } * } * } * * type X = SchemaUID; * // 'api::foo.foo' | 'api::bar.bar' */ export type SchemaUID = keyof Strapi.Schemas; /** * Get the type of a specific key `U` in `T` * * @example * * type X = Get<{ foo: 'bar', 'bar': 'foo' }, 'foo'> * // 'bar' * * type X = Get<{ foo: 'bar', 'bar': 'foo' }, 'bar'> * // 'foo' */ export type Get<T, U extends keyof T> = T[U];