warscript
Version:
A typescript library for Warcraft III using Warpack.
85 lines (84 loc) • 7.01 kB
TypeScript
/// <reference types="@typescript-to-lua/language-extensions" />
/** @noSelfInFile */
import { DispatchingEvent } from "../event";
import { AbstractConstructor } from "../utility/types";
import { ObjectDataEntry, ObjectDataEntryIdType, ObjectDataEntryLevelFieldValueSupplier } from "./object-data/entry";
export type ObjectFieldId = number & {
readonly __objectDataEntryFieldId: unique symbol;
};
export type ObjectFieldConstructor<T extends ObjectFieldBase<any, any, any, any>> = OmitConstructor<typeof ObjectFieldBase> & (new (id: number) => T);
export type ObjectFieldAbstractConstructor<T extends ObjectFieldBase<any, any, any, any>> = OmitConstructor<typeof ObjectFieldBase> & (abstract new (id: number) => T);
declare abstract class ObjectFieldBase<ObjectDataEntryType extends ObjectDataEntry, InstanceType extends AnyNotNil, ValueType, NativeFieldType> {
protected readonly valueByInstance: LuaMap<InstanceType, ValueType>;
protected abstract readonly instanceClass: AbstractConstructor<InstanceType> | Function;
supports(instance: AnyNotNil): instance is InstanceType & {
readonly __oneSidedTypeGuard: unique symbol;
};
protected get nativeField(): NativeFieldType;
readonly id: ObjectFieldId;
protected abstract getNativeFieldById(id: number): NativeFieldType;
protected abstract getObjectDataEntryId(instance: InstanceType): ObjectDataEntryIdType<ObjectDataEntryType>;
constructor(id: number);
static create<T extends ObjectFieldBase<any, any, any, any>>(this: ObjectFieldConstructor<T>, id?: number): T & symbol;
static of<T extends ObjectFieldBase<any, any, any, any>>(this: ObjectFieldAbstractConstructor<T>, id: number): T | undefined;
}
export type ObjectFieldValueChangeEvent<T extends ObjectField<any, any, any, any> | ReadonlyObjectFieldType<ObjectField<any, any, any, any>>> = T extends ObjectField<any, infer InstanceType, infer ValueType, any> ? DispatchingEvent<[
instance: InstanceType,
field: T,
previousValue: ValueType,
newValue: ValueType
]> : T extends ReadonlyObjectFieldType<ObjectField<any, infer InstanceType, infer ValueType, any>> ? DispatchingEvent<[
instance: InstanceType,
field: T,
previousValue: ValueType,
newValue: ValueType
]> : never;
export type ReadonlyObjectFieldType<T extends ObjectField<any, any, any, any>> = Omit<T, "setValue" | "removeValue">;
type ReadonlyObjectFieldConstructor<T extends ObjectField> = OmitConstructor<typeof ObjectField> & (abstract new (...args: any[]) => ReadonlyObjectFieldType<T>);
export declare abstract class ObjectField<ObjectDataEntryType extends ObjectDataEntry = ObjectDataEntry, InstanceType extends AnyNotNil = AnyNotNil, ValueType extends number | string | boolean = number | string | boolean, NativeFieldType = unknown> extends ObjectFieldBase<ObjectDataEntryType, InstanceType, ValueType, NativeFieldType> {
protected abstract readonly defaultValue: ValueType;
protected abstract getNativeFieldValue(instance: InstanceType): ValueType;
protected abstract setNativeFieldValue(instance: InstanceType, value: ValueType): boolean;
getValue(entry: ObjectDataEntryType | InstanceType): ValueType;
setValue(entry: ObjectDataEntryType | InstanceType, value: ValueType): boolean;
removeValue(entry: ObjectDataEntryType): boolean;
private invokeValueChangeEvent;
private invokeValueChangeEventRecursive;
protected static getOrCreateValueChangeEvent<T extends ObjectField, R extends ReadonlyObjectFieldType<T>>(this: ReadonlyObjectFieldConstructor<T>): ObjectFieldValueChangeEvent<R>;
static get valueChangeEvent(): ObjectFieldValueChangeEvent<ReadonlyObjectFieldType<ObjectField>>;
}
export type ReadonlyObjectLevelFieldType<T extends ObjectLevelField<any, any, any, any>> = Omit<T, "setValue">;
export type ObjectLevelFieldValueChangeEvent<T extends ObjectLevelField<any, any, any, any> | ReadonlyObjectLevelFieldType<ObjectLevelField<any, any, any, any>>> = T extends ObjectLevelField<any, infer InstanceType, infer ValueType, any, any> ? DispatchingEvent<[
instance: InstanceType,
field: T,
level: number,
previousValue: ValueType,
newValue: ValueType
]> : T extends ReadonlyObjectLevelFieldType<ObjectLevelField<any, infer InstanceType, infer ValueType, any, any>> ? DispatchingEvent<[
instance: InstanceType,
field: T,
level: number,
previousValue: ValueType,
newValue: ValueType
]> : never;
type ReadonlyObjectLevelFieldConstructor<T extends ObjectLevelField> = OmitConstructor<typeof ObjectLevelField> & (abstract new (...args: any[]) => ReadonlyObjectLevelFieldType<T>);
export declare abstract class ObjectArrayField<ObjectDataEntryType extends ObjectDataEntry = ObjectDataEntry, InstanceType extends AnyNotNil = AnyNotNil, ValueType extends number | string | boolean = number | string | boolean, NativeFieldType = unknown> extends ObjectFieldBase<ObjectDataEntryType, InstanceType, ValueType[], NativeFieldType> {
protected abstract readonly defaultValue: ValueType;
protected abstract getNativeFieldValue(instance: InstanceType, index: number): ValueType;
protected abstract setNativeFieldValue(instance: InstanceType, index: number, value: ValueType): boolean;
getValue<IndexType extends [number] | []>(entry: ObjectDataEntryType | InstanceType, ...[index]: IndexType): IndexType extends [number] ? ValueType : ValueType[];
setValue(entry: ObjectDataEntryType | InstanceType, value: ValueType[]): boolean;
}
export declare abstract class ObjectLevelField<ObjectDataEntryType extends ObjectDataEntry = ObjectDataEntry, InstanceType extends AnyNotNil = AnyNotNil, ValueType extends number | string | boolean = number | string | boolean, InputValueType extends ValueType = never, NativeFieldType = unknown> extends ObjectFieldBase<ObjectDataEntryType, InstanceType, ValueType[], NativeFieldType> {
protected abstract readonly defaultValue: ValueType;
protected abstract getNativeFieldValue(instance: InstanceType, level: number): ValueType;
protected abstract setNativeFieldValue(instance: InstanceType, level: number, value: ValueType): boolean;
protected abstract getLevelCount(entry: ObjectDataEntryType | InstanceType): number;
getValue<LevelType extends [number] | []>(entry: ObjectDataEntryType | InstanceType, ...[level]: LevelType): LevelType extends [number] ? ValueType : ValueType[];
setValue(entry: ObjectDataEntryType | InstanceType, ...[levelOrValue, value]: [value: ObjectDataEntryLevelFieldValueSupplier<InputValueType, ValueType>] | [level: number, value: InputValueType]): boolean;
private invokeValueChangeEvent;
private invokeValueChangeEventRecursive;
protected static getOrCreateValueChangeEvent<T extends ObjectLevelField, R extends ReadonlyObjectLevelFieldType<T>>(this: ReadonlyObjectLevelFieldConstructor<T>): ObjectLevelFieldValueChangeEvent<R>;
static get valueChangeEvent(): ObjectLevelFieldValueChangeEvent<ReadonlyObjectLevelFieldType<ObjectLevelField>>;
}
export {};