/** * 获取对象、数组、类数组中的值的类型组成联合类型 * @example * type Props = { name: string; age: number; visible: boolean }; * // Expect: string | number | boolean * type PropsValues = ValuesType; * * type NumberArray = number[]; * // Expect: number * type NumberItems = ValuesType; * * type ReadonlySymbolArray = readonly symbol[]; * // Expect: symbol * type SymbolItems = ValuesType; * * type NumberTuple = [1, 2]; * // Expect: 1 | 2 * type NumberUnion = ValuesType; * * type ReadonlyNumberTuple = readonly [1, 2]; * // Expect: 1 | 2 * type AnotherNumberUnion = ValuesType; * * type BinaryArray = Uint8Array; * // Expect: number * type BinaryItems = ValuesType; */ export type ValuesType | ArrayLike | Record> = T extends ReadonlyArray ? T[number] : T extends ArrayLike ? T[number] : T extends object ? T[keyof T] : never;