import { BaseControl } from "./Typing"; type Widen = T extends string ? string : T extends number ? number : T extends boolean ? boolean : T; type ConditionalWiden = W extends true ? Widen : T; type CheckeableDatatypes = Pick>; type ListType = [string, number, boolean, Callback, object][number]; type ChooseOptionType = CheckeableDatatypes | ListType; interface RGBA { Color: Color3; Transparency: number; } // I want to keep the "RGBA" name for the control type, but it collides with AdvancedTypes.RGBA type OuterRGBA = RGBA; //TYPES export declare namespace AdvancedTypes { interface Choose extends BaseControl<"Choose", T> { List: T[]; DefIndex: number; } interface EnumList extends BaseControl<"EnumList", T> { List: Record; DefIndex: string; CurrentIndex: string; } interface RGBA extends BaseControl<"RGBA", OuterRGBA> {} interface Slider extends BaseControl<"Slider", number> { Min: number; Max: number; Step?: number; } interface Object extends BaseControl<"Object", Instances[T] | undefined> { ClassName: T; Predicator?: (instance: K) => boolean; } //need this because I cant use a namespace as a type interface All { Choose: Choose; EnumList: EnumList; RGBA: RGBA; Slider: Slider; Object: Object; } } //CREATION declare function Choose( list: T[], def?: number, widen?: W, ): AdvancedTypes.Choose>; declare function EnumList( list: Record, def: string, widen?: W, ): AdvancedTypes.EnumList>; declare function RGBA(def: Color3, transparency?: number): AdvancedTypes.RGBA; declare function Slider(def: number, min: number, max: number, step?: number): AdvancedTypes.Slider; type GetInstance = Instances[T extends undefined ? "Instance" : T]; declare function Object(): AdvancedTypes.Object<"Instance">; declare function Object( className?: T, def?: GetInstance, predicator?: (instance: GetInstance) => boolean, ): AdvancedTypes.Object;