declare module "godot" { const IntegerType: unique symbol; const FloatType: unique symbol; /** * Proxy objects are typically transparent by design, allowing a proxy to impersonate a type. However, GodotJS also * makes use of proxies to wrap existing objects in order to provide a more convenient API. In such cases, it is * convenient to be able to unwrap the object i.e. obtain access to the target object. In order to achieve this, * GodotJS exposes a property with the key ProxyTarget. You can access this to, for example, obtain direct access * to the original GDictionary wrapped via a call to .proxy(). Additionally, GodotJS uses this property internally * to unwrap proxies, thus allowing you to pass a proxy wrapped GArray/GDictionary as an argument to any function * expecting a GArray/GDictionary parameter. */ const ProxyTarget: unique symbol; /** * FOR BACKWARD COMPATIBILITY ONLY * @deprecated [WARNING] Use Callable/Callable. */ type AnyCallable = Callable; /** * FOR BACKWARD COMPATIBILITY ONLY * @deprecated [WARNING] Use Signal/Signal. */ type AnySignal = Signal; /** * FOR BACKWARD COMPATIBILITY ONLY * @deprecated [WARNING] Use Callable. */ type Callable0 = Callable<() => R>; /** * FOR BACKWARD COMPATIBILITY ONLY * @deprecated [WARNING] Use Callable. */ type Callable1 = Callable<(v1: T1) => R>; /** * FOR BACKWARD COMPATIBILITY ONLY * @deprecated [WARNING] Use Callable. */ type Callable2 = Callable<(v1: T1, v2: T2) => R>; /** * FOR BACKWARD COMPATIBILITY ONLY * @deprecated [WARNING] Use Callable. */ type Callable3 = Callable<(v1: T1, v2: T2, v3: T3) => R>; /** * FOR BACKWARD COMPATIBILITY ONLY * @deprecated [WARNING] Use Callable. */ type Callable4 = Callable<(v1: T1, v2: T2, v3: T3, v4: T4) => R>; /** * FOR BACKWARD COMPATIBILITY ONLY * @deprecated [WARNING] Use Callable. */ type Callable5 = Callable<(v1: T1, v2: T2, v3: T3, v4: T4, v5: T5) => R>; /** * FOR BACKWARD COMPATIBILITY ONLY * @deprecated [WARNING] Use Signal. */ type Signal0 = Signal<() => void>; /** * FOR BACKWARD COMPATIBILITY ONLY * @deprecated [WARNING] Use Signal. */ type Signal1 = Signal<(v1: T1) => void>; /** * FOR BACKWARD COMPATIBILITY ONLY * @deprecated [WARNING] Use Signal. */ type Signal2 = Signal<(v1: T1, v2: T2) => void>; /** * FOR BACKWARD COMPATIBILITY ONLY * @deprecated [WARNING] Use Signal. */ type Signal3 = Signal<(v1: T1, v2: T2, v3: T3) => void>; /** * FOR BACKWARD COMPATIBILITY ONLY * @deprecated [WARNING] Use Signal. */ type Signal4 = Signal<(v1: T1, v2: T2, v3: T3, v4: T4) => void>; /** * FOR BACKWARD COMPATIBILITY ONLY * @deprecated [WARNING] Use Signal. */ type Signal5 = Signal<(v1: T1, v2: T2, v3: T3, v4: T4, v5: T5) => void>; type ExtractValueKeys = { [K in keyof T]: T[K] extends V ? K : never }[keyof T]; type IfAny = 0 extends 1 & T ? Y : N; type UndefinedToNull = T extends undefined ? null : T; // A bit convoluted, but written this way to mitigate type definitions circularly depending on themselves. type GodotNames = "__godotNameMap" extends keyof T ? keyof T["__godotNameMap"] | Exclude : keyof T; type ResolveGodotName = Name extends keyof T ? Name : "__godotNameMap" extends keyof T ? Name extends keyof T["__godotNameMap"] ? T["__godotNameMap"][Name] : never : never; type ResolveGodotNameValue = Name extends keyof T ? T[Name] : "__godotNameMap" extends keyof T ? Name extends keyof T["__godotNameMap"] ? T["__godotNameMap"][Name] extends keyof T ? T[T["__godotNameMap"][Name]] : never : never : never; type ResolveGodotNameParameters = Name extends GodotDynamicDispatchName ? GAny[] : ResolveGodotName extends keyof T ? T[ResolveGodotName] extends { bivarianceHack(...args: infer P extends GAny[]): void | GAny; }["bivarianceHack"] ? P : never : never; type ResolveGodotReturnType = Name extends GodotDynamicDispatchName ? void | GAny : ResolveGodotName extends keyof T ? T[ResolveGodotName] extends (...args: any[]) => infer R ? R : never : never; /** * Godot has many APIs that are a form of dynamic dispatch, i.e., they take the name of a function or property and * then operate on the value matching the name. TypeScript is powerful enough to allow us to type these APIs. * However, since these APIs can be used to call each other, the type checker can get hung up trying to infinitely * recurse on these types. What follows is an interface with the built-in dynamic dispatch names. GodotJS' types * will not recurse through methods matching these names. If you want to build your own dynamic dispatch APIs, you * can use interface merging to insert additional method names. */ interface GodotDynamicDispatchNames { call: "call"; callv: "callv"; call_deferred: "call_deferred"; add_do_method: "add_do_method"; add_undo_method: "add_undo_method"; } type GodotDynamicDispatchName = GodotDynamicDispatchNames[keyof GodotDynamicDispatchNames]; /** * This namespace and the values within do not exist at runtime. They're declared here, for internal use only, as a * work-around for limitations of TypeScript's type system. */ namespace __PathMappableDummyKeys {} type PathMappable = { [K in DummyKey]: Map; }; type PathMap = Record; type StaticPath< Map extends PathMap, Permitted = any, DefaultKey extends string = never, DummyKey extends symbol = (typeof __PathMappableDummyKeys)[keyof typeof __PathMappableDummyKeys], > = IfAny< Map, string, | (ExtractValueKeys & string) | (DummyKey extends any ? | (Map[DefaultKey] extends never ? never : Map[DefaultKey] extends PathMappable ? StaticPath : never) | { [K in Exclude & string]: Map[K] extends PathMappable< DummyKey, infer ChildMap > ? `${K}/${StaticPath}` : never; }[Exclude & string] : never) >; type ResolvePath< Map extends PathMap, Path extends string, Default, Permitted, DefaultKey extends string = never, DummyKey extends symbol = (typeof __PathMappableDummyKeys)[keyof typeof __PathMappableDummyKeys], > = IfAny< Map, Permitted, DummyKey extends any ? Path extends keyof Map ? [Map[Path]] extends [Permitted] ? [undefined] extends [Map[Path]] ? null | Exclude : Map[Path] : Default : Path extends `${infer Key extends Exclude & string}/${infer SubPath}` ? Map[Key] extends PathMappable ? ResolvePath : Default : Map[DefaultKey] extends PathMappable ? ResolvePath : never : never >; type PathMapChild = IfAny< Map, Permitted, Map[keyof Map] extends undefined | Permitted ? Exclude : Default >; type NodePathMap = PathMap; type StaticNodePath = StaticPath< Map, Permitted, never, typeof __PathMappableDummyKeys.Node >; type ResolveNodePath = ResolvePath< Map, Path, Default, Permitted, never, typeof __PathMappableDummyKeys.Node >; type ResolveNodePathMap = Path extends keyof Map ? Map[Path] extends Node ? ChildMap : Default : Path extends `${infer Key extends keyof Map & string}/${infer SubPath}` ? Map[Key] extends Node ? ResolveNodePathMap : Default : Default; type NodePathMapChild = PathMapChild; type AnimationMixerPathMap = PathMap; type StaticAnimationMixerPath = StaticPath< Map, Animation, "", (typeof __PathMappableDummyKeys)["AnimationLibrary" | "AnimationMixer"] >; type ResolveAnimationMixerPath< Map extends AnimationMixerPathMap, Path extends string, Default = never, > = ResolvePath< Map, Path, Default, Animation, "", (typeof __PathMappableDummyKeys)["AnimationLibrary" | "AnimationMixer"] >; type GArrayElement = T extends any[] ? T[I] : T; /** * GArray elements are exposed with a subset of JavaScript's standard Array API. Array indexes are exposed as * enumerable properties, thus if you want to perform more complex operations you can convert to a regular * JavaScript array with [...g_array.proxy()]. */ class GArrayProxy { [Symbol.iterator](): IteratorObject>; /** * Gets the length of the array. This is a number one higher than the highest index in the array. */ get length(): number; /** * Performs the specified action for each element in an array. * @param callback A function that accepts up to three arguments. forEach calls the callback function one time for each element in the array. * @param thisArg An object to which the this keyword can refer in the callback function. If thisArg is omitted, undefined is used as the this value. */ forEach>( callback: (this: GArrayProxy, value: GProxyValueWrap, index: number) => void, thisArg?: S, ): void; /** * Removes the last element from an array and returns it. * If the array is empty, undefined is returned and the array is not modified. */ pop(): GProxyValueWrap | undefined; /** * Appends new elements to the end of an array, and returns the new length of the array. * @param item New element to add to the array. * @param additionalItems Additional new elements to add to the array. */ push(item: T | GProxyValueWrap, ...additionalItems: Array>): number; /** * Returns the index of the first occurrence of a value in an array, or -1 if it is not present. * @param searchElement The value to locate in the array. * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0. */ indexOf(searchElement: T | GProxyValueWrap, fromIndex?: number): number; /** * Determines whether an array includes a certain element, returning true or false as appropriate. * @param searchElement The element to search for. */ includes(searchElement: T | GProxyValueWrap): boolean; toJSON(key?: any): any; toString(): string; [n: number]: T | GProxyValueWrap; // More accurate get type blocked by https://github.com/microsoft/TypeScript/issues/43826 } // Ideally this would be a class, but TS currently doesn't provide a way to type a class with mapped properties. /** * GObject entries are exposed as enumerable properties, so Object.keys(), GObject.entries() etc. will work. */ type GDictionaryProxy = { [K in keyof T]: T[K] | GProxyValueWrap; // More accurate get type blocked by https://github.com/microsoft/TypeScript/issues/43826 }; type GProxyValueWrap = V extends GArray ? GArrayProxy> : V extends GDictionary ? GDictionaryProxy : V; type GProxyValueUnwrap = V extends GArrayProxy ? E : V extends GDictionaryProxy ? T : V; type GWrappableValue = GAny | GWrappableValue[] | { [key: number | string]: GWrappableValue }; type GValueWrapUnchecked = V extends any[] ? number extends V["length"] ? GArray> : GArray<{ [I in keyof V]: GValueWrapUnchecked }> : V extends GAny ? V : GDictionary<{ [K in keyof V]: GValueWrapUnchecked }>; type GValueWrap = [keyof V] extends [never] ? GDictionary<{}> : [V] extends [GWrappableValue] ? GValueWrapUnchecked : never; type GValueUnwrap = V extends GArray ? T extends any[] ? { [I in keyof T]: GValueUnwrap } : Array> : V extends GDictionary ? { [K in keyof T]: GValueUnwrap } : V; /** * Semi-workaround for https://github.com/microsoft/TypeScript/issues/43826. * @see GReadProxyValueWrap */ type GArrayReadProxy = Omit, "forEach"> & { [Symbol.iterator](): IteratorObject>; forEach>( callback: (this: GArrayReadProxy, value: GReadProxyValueWrap, index: number) => void, thisArg?: S, ): void; [n: number]: GReadProxyValueWrap; }; /** * Semi-workaround for https://github.com/microsoft/TypeScript/issues/43826. * @see GReadProxyValueWrap */ type GDictionaryReadProxy = { [K in keyof T]: GReadProxyValueWrap; }; // At runtime we only have the one kind of dictionary proxy and one kind of array proxy. The read interfaces have // indexers typed correctly for access i.e. return proxied types. The non-read interfaces have indexers accurate for // assignment and will accept both GArray/GDictionary and proxies. The read interfaces exist for convenience only, // you can safely cast between the two interfaces types as desired. type GReadProxyValueWrap = V extends GArray ? GArrayReadProxy : V extends GDictionary ? GDictionaryReadProxy : V; interface PropertyInfo { name: string; type: Variant.Type; class_name: string; hint: PropertyHint; hint_string: string; usage: PropertyUsageFlags; } type BindRight = F extends ( this: infer T, ...args: [...infer A, ...B] ) => infer R ? (this: T, ...args: A) => R : never; }