import { IsValue, Negate } from "."; export type IsReadonlyArray = Arr extends unknown[] ? false : true; export type IsWritableArray = Negate>; /** * Map template */ type MapTemplate = Arr extends readonly [infer Head, ...infer Rest] ? [Head, ...MapTemplate] : Arr extends readonly [infer Item] ? [Item] // 1. 传入的是 [] 2. 递归到最后为[] : Arr extends readonly [] ? [] // 传入的是 number[] 之类的 : Arr; /** * @example * type OriginalArr = [1, '']; * type Arr = ReadonlyArray; // readonly [1, ''] */ export type ReadonlyArray = readonly [...Arr]; type PureWritableArray = Arr extends readonly [infer Head, ...infer Rest] ? IsValue extends true ? [Head, ...PureWritableArray] : [...PureArray] : Arr extends readonly [infer Item] ? IsValue extends true ? [Item] : [] // 1. 传入的是 [] 2. 递归到最后为[] : Arr extends readonly [] ? [] // 传入的是 number[] 之类的 : Arr; /** * filter out `never` and `void` * * @example * type OriginalArr = [1, '', false, number, string, boolean, symbol, {}, object, Error, null, undefined, never, void]; * type Arr = PureArray; // [1, "", false, number, string, boolean, symbol, {}, object, Error, null, undefined] * * type ReadonlyOriginalArr = readonly [1, 2, never, void]; * type ReadonlyArr = PureArray; // readonly [1, 2] */ export type PureArray = IsReadonlyArray extends true ? ReadonlyArray> : PureWritableArray;