react-native-unistyles
Version:
Level up your React Native StyleSheet
22 lines (15 loc) • 823 B
text/typescript
import type { SafeReturnType } from './common'
export type ExtractVariantNames<T> = ExtractVariantKeys<SafeReturnType<T>>
type ExtractVariantKeys<T> = T extends object ? ExtractVariant<SafeReturnType<T[keyof T]>> : never
type HasBooleanVariants<T> = T extends Record<'true', any> ? true : T extends Record<'false', any> ? true : false
type ExtractSubVariantKeys<T> = T extends object
? HasBooleanVariants<T> extends true
? keyof Omit<T, 'default'> | boolean | undefined
: keyof Omit<T, 'default'> | undefined
: never
type ExtractVariant<T> = T extends { variants: infer V } ? { [key in keyof V]?: ExtractSubVariantKeys<V[key]> } : never
export type UnistylesVariants<ST> = ST extends { useVariants: infer V }
? V extends (variants: infer T) => void
? T
: never
: never