Auxiliary functions to fix type complaints in item managers

This commit is contained in:
Wlowscha 2025-07-10 23:21:58 +02:00
parent 175f2b74e9
commit 2744567b21
No known key found for this signature in database
GPG Key ID: 3C8F1AD330565D04
3 changed files with 40 additions and 32 deletions

View File

@ -10,6 +10,7 @@ import {
type FormChangeItemSpecs, type FormChangeItemSpecs,
type HeldItemSaveData, type HeldItemSaveData,
} from "#app/items/held-item-data-types"; } from "#app/items/held-item-data-types";
import { getTypedEntries, getTypedKeys } from "#app/utils/common";
export class PokemonItemManager { export class PokemonItemManager {
public heldItems: HeldItemDataMap; public heldItems: HeldItemDataMap;
@ -34,58 +35,58 @@ export class PokemonItemManager {
generateHeldItemConfiguration(restrictedIds?: HeldItemId[]): HeldItemConfiguration { generateHeldItemConfiguration(restrictedIds?: HeldItemId[]): HeldItemConfiguration {
const config: HeldItemConfiguration = []; const config: HeldItemConfiguration = [];
for (const [k, item] of Object.entries(this.heldItems)) { for (const [id, item] of getTypedEntries(this.heldItems)) {
const id = Number(k);
if (item && (!restrictedIds || id in restrictedIds)) { if (item && (!restrictedIds || id in restrictedIds)) {
const specs: HeldItemSpecs = { ...item, id }; const specs: HeldItemSpecs = { ...item, id };
config.push({ entry: specs, count: 1 }); config.push({ entry: specs, count: 1 });
} }
} }
for (const [k, item] of Object.entries(this.formChangeItems)) { for (const [id, item] of getTypedEntries(this.formChangeItems)) {
const id = Number(k); if (item) {
const specs: FormChangeItemSpecs = { ...item, id }; const specs: FormChangeItemSpecs = { ...item, id };
config.push({ entry: specs, count: 1 }); config.push({ entry: specs, count: 1 });
} }
}
return config; return config;
} }
generateSaveData(): HeldItemSaveData { generateSaveData(): HeldItemSaveData {
const saveData: HeldItemSaveData = []; const saveData: HeldItemSaveData = [];
for (const [k, item] of Object.entries(this.heldItems)) { for (const [id, item] of getTypedEntries(this.heldItems)) {
const id = Number(k);
if (item) { if (item) {
const specs: HeldItemSpecs = { ...item, id }; const specs: HeldItemSpecs = { ...item, id };
saveData.push(specs); saveData.push(specs);
} }
} }
for (const [k, item] of Object.entries(this.formChangeItems)) { for (const [id, item] of getTypedEntries(this.formChangeItems)) {
const id = Number(k); if (item) {
const specs: FormChangeItemSpecs = { ...item, id }; const specs: FormChangeItemSpecs = { ...item, id };
saveData.push(specs); saveData.push(specs);
} }
}
return saveData; return saveData;
} }
getHeldItems(): number[] { getHeldItems(): HeldItemId[] {
return Object.keys(this.heldItems).map(k => Number(k)); return getTypedKeys(this.heldItems);
} }
getTransferableHeldItems(): number[] { getTransferableHeldItems(): HeldItemId[] {
return Object.keys(this.heldItems) return getTypedKeys(this.heldItems)
.filter(k => allHeldItems[k].isTransferable) .filter(k => allHeldItems[k].isTransferable)
.map(k => Number(k)); .map(k => k);
} }
getStealableHeldItems(): number[] { getStealableHeldItems(): HeldItemId[] {
return Object.keys(this.heldItems) return getTypedKeys(this.heldItems)
.filter(k => allHeldItems[k].isStealable) .filter(k => allHeldItems[k].isStealable)
.map(k => Number(k)); .map(k => k);
} }
getSuppressableHeldItems(): number[] { getSuppressableHeldItems(): HeldItemId[] {
return Object.keys(this.heldItems) return getTypedKeys(this.heldItems)
.filter(k => allHeldItems[k].isSuppressable) .filter(k => allHeldItems[k].isSuppressable)
.map(k => Number(k)); .map(k => k);
} }
hasItem(itemType: HeldItemId): boolean { hasItem(itemType: HeldItemId): boolean {
@ -93,7 +94,7 @@ export class PokemonItemManager {
} }
hasItemCategory(categoryId: HeldItemCategoryId): boolean { hasItemCategory(categoryId: HeldItemCategoryId): boolean {
return Object.keys(this.heldItems).some(id => isItemInCategory(Number(id), categoryId)); return getTypedKeys(this.heldItems).some(id => isItemInCategory(id, categoryId));
} }
getStack(itemType: HeldItemId): number { getStack(itemType: HeldItemId): number {
@ -117,7 +118,7 @@ export class PokemonItemManager {
overrideItems(newItems: HeldItemDataMap) { overrideItems(newItems: HeldItemDataMap) {
this.heldItems = newItems; this.heldItems = newItems;
// The following is to allow randomly generated item configs to have stack 0 // The following is to allow randomly generated item configs to have stack 0
for (const [item, properties] of Object.entries(this.heldItems)) { for (const [item, properties] of getTypedEntries(this.heldItems)) {
if (!properties || properties.stack <= 0) { if (!properties || properties.stack <= 0) {
delete this.heldItems[item]; delete this.heldItems[item];
} }
@ -208,7 +209,7 @@ export class PokemonItemManager {
} }
getFormChangeItems(): FormChangeItem[] { getFormChangeItems(): FormChangeItem[] {
return Object.keys(this.formChangeItems).map(k => Number(k)); return getTypedKeys(this.formChangeItems).map(k => k);
} }
getActiveFormChangeItems(): FormChangeItem[] { getActiveFormChangeItems(): FormChangeItem[] {

View File

@ -7,6 +7,7 @@ import {
type TrainerItemDataMap, type TrainerItemDataMap,
type TrainerItemSpecs, type TrainerItemSpecs,
} from "#app/items/trainer-item-data-types"; } from "#app/items/trainer-item-data-types";
import { getTypedEntries, getTypedKeys } from "#app/utils/common";
export class TrainerItemManager { export class TrainerItemManager {
public trainerItems: TrainerItemDataMap; public trainerItems: TrainerItemDataMap;
@ -29,8 +30,7 @@ export class TrainerItemManager {
generateTrainerItemConfiguration(restrictedIds?: TrainerItemId[]): TrainerItemConfiguration { generateTrainerItemConfiguration(restrictedIds?: TrainerItemId[]): TrainerItemConfiguration {
const config: TrainerItemConfiguration = []; const config: TrainerItemConfiguration = [];
for (const [k, item] of Object.entries(this.trainerItems)) { for (const [id, item] of getTypedEntries(this.trainerItems)) {
const id = Number(k);
if (item && (!restrictedIds || id in restrictedIds)) { if (item && (!restrictedIds || id in restrictedIds)) {
const specs: TrainerItemSpecs = { ...item, id }; const specs: TrainerItemSpecs = { ...item, id };
config.push({ entry: specs, count: 1 }); config.push({ entry: specs, count: 1 });
@ -41,8 +41,7 @@ export class TrainerItemManager {
generateSaveData(): TrainerItemSaveData { generateSaveData(): TrainerItemSaveData {
const saveData: TrainerItemSaveData = []; const saveData: TrainerItemSaveData = [];
for (const [k, item] of Object.entries(this.trainerItems)) { for (const [id, item] of getTypedEntries(this.trainerItems)) {
const id = Number(k);
if (item) { if (item) {
const specs: TrainerItemSpecs = { ...item, id }; const specs: TrainerItemSpecs = { ...item, id };
saveData.push(specs); saveData.push(specs);
@ -51,8 +50,8 @@ export class TrainerItemManager {
return saveData; return saveData;
} }
getTrainerItems(): number[] { getTrainerItems(): TrainerItemId[] {
return Object.keys(this.trainerItems).map(k => Number(k)); return getTypedKeys(this.trainerItems);
} }
hasItem(itemType: TrainerItemId): boolean { hasItem(itemType: TrainerItemId): boolean {

View File

@ -285,6 +285,14 @@ export function getEnumValues(enumType: any): number[] {
.map(v => Number.parseInt(v!.toString())); .map(v => Number.parseInt(v!.toString()));
} }
export function getTypedKeys<T extends Record<number, any>, K extends number = Extract<keyof T, number>>(obj: T): K[] {
return Object.keys(obj).map(k => Number(k) as K);
}
export function getTypedEntries<T extends object>(obj: T): [keyof T, T[keyof T]][] {
return Object.entries(obj) as [keyof T, T[keyof T]][];
}
export function executeIf<T>(condition: boolean, promiseFunc: () => Promise<T>): Promise<T | null> { export function executeIf<T>(condition: boolean, promiseFunc: () => Promise<T>): Promise<T | null> {
return condition ? promiseFunc() : new Promise<T | null>(resolve => resolve(null)); return condition ? promiseFunc() : new Promise<T | null>(resolve => resolve(null));
} }